Попытка использовать SBT из Domino Java Agent завершается неудачно с NoSuchMethodError: org / apache / http / protocol / BasicHttpContext.<Init>() V

ОБНОВЛЕНИЕ 30 октября, см. Внизу вопроса.

Я создал рабочий образец автономного Java-приложения в Eclipse (на основе SBT sbt.sample.app GetAllCommunitiesApp.java. Единственное мое изменение заключается в том, что я вручную создаю BasicEndpoint, чтобы пропустить использование управляемых bean-компонентов для конфигурации конечной точки (и таким образом, чтение файла managed-beans.xml). Как уже говорилось, все это прекрасно работает в Eclipse.

Перемещая код в локальный Java-агент Notes (агент помещается в локальную базу данных), я в первую очередь скопировал jar-файлы SBT в мой C:\Program Files (x86)\IBM\Lotus\Notes\jvm\lib\ext каталог. Ниже приведен список этих файлов. Когда я запускаю Java-агент, я получаю следующую трассировку стека;

Exception in thread "AgentThread: JavaAgent" java.lang.NoSuchMethodError: org/apache/http/protocol/BasicHttpContext.<init>()V
    at org.apache.http.impl.client.AbstractHttpClient.createHttpContext(AbstractHttpClient.java:285)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:851)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
    at com.ibm.sbt.services.client.ClientService.executeRequest(ClientService.java:1043)
    at com.ibm.sbt.services.client.ClientService._xhr(ClientService.java:1006)
    at com.ibm.sbt.services.client.ClientService.execRequest(ClientService.java:972)
    at com.ibm.sbt.services.client.ClientService.xhr(ClientService.java:932)
    at com.ibm.sbt.services.client.ClientService.get(ClientService.java:808)
    at com.ibm.sbt.services.client.ClientService.get(ClientService.java:804)
    at com.ibm.sbt.services.client.base.BaseService.retrieveData(BaseService.java:350)
    at com.ibm.sbt.services.client.base.BaseService.retrieveData(BaseService.java:372)
    at com.ibm.sbt.services.client.base.BaseService.retrieveData(BaseService.java:325)
    at com.ibm.sbt.services.client.base.BaseService.getEntities(BaseService.java:185)
    at com.ibm.sbt.services.client.connections.communities.CommunityService.getMyCommunities(CommunityService.java:265)
    at com.ibm.sbt.services.client.connections.communities.CommunityService.getMyCommunities(CommunityService.java:249)
    at no.tine.sbt.SBTCommunityHelper.getMyCommunities(SBTCommunityHelper.java:36)
    at JavaAgent.NotesMain(JavaAgent.java:27)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(Unknown Source)

Поиск в Stackru и на других сайтах показывает, что другие сталкивались с аналогичными проблемами в смешанных версиях Apache HttpClient (обычно люди используют httpclient 4.0.1, и проблема исчезла, заменив ее на httpclient 4.1). SBT включает в себя httpclient-4.2.1.jar - это файл, который я скопировал в C:\Program Files (x86)\IBM\Lotus\Notes\jvm\lib\ext Lotus Notes.

Мне кажется, что Lotus Notes каким-то образом использует какой-то другой httpclient откуда-то, что, возможно, устарело.

Итак, вопрос в том, могу ли я заставить Notes использовать SBT-банки каким-либо образом? Есть идеи?

Для справки: файлы jar SBT, которые я скопировал в мой C:\Program Files (x86)\IBM\Lotus\Notes\jvm\lib\ext, являются;

com.ibm.commons-1.0.0.20131024-1349.jar
com.ibm.commons.runtime-1.0.0.20131024-1349.jar
com.ibm.commons.xml-1.0.0.20131024-1349.jar
com.ibm.sbt.core-1.0.0.20131024-1349.jar
com.ibm.sbt.playground-1.0.0.20131024-1349.jar
apache-mime4j-0.6.jar
com.ibm.sbt.javamail-1.4.5.jar
commons-codec-1.3.jar
commons-fileupload-1.2.2.jar
commons-io-2.4.jar
commons-logging-1.1.1.jar
httpclient-4.2.1.jar
httpcore-4.2.1.jar
httpmime-4.2.1.jar

ОБНОВЛЕНИЕ 30 ОКТЯБРЯ 2013 - Найден образец, который, возможно, идет по тем же направлениям. Следующий код представляет собой полный Java-агент Notes с основным кодом непосредственно из примера кода Apache.org HttpClient 4.2. Это также генерирует NoSuchMethodError, и, возможно, его легче отладить, чем SBT.

 /*
 * Sample retrieved from 
 * http://hc.apache.org/httpcomponents-client-4.2.x/httpclient/examples/org/apache/http/examples/client/ClientWithResponseHandler.java
 */
import java.io.IOException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import lotus.domino.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

      try {
          Session session = getSession();
          AgentContext agentContext = session.getAgentContext();

          HttpClient httpclient = new DefaultHttpClient();
          try {
              HttpGet httpget = new HttpGet("http://www.google.com/");

              System.out.println("executing request " + httpget.getURI());

              // Create a response handler
              ResponseHandler<String> responseHandler = new BasicResponseHandler();
              String responseBody = httpclient.execute(httpget, responseHandler);
              System.out.println("----------------------------------------");
              System.out.println(responseBody);
              System.out.println("----------------------------------------");

          } finally {
              // When HttpClient instance is no longer needed,
              // shut down the connection manager to ensure
              // immediate deallocation of all system resources
              httpclient.getConnectionManager().shutdown();
          }


          // Notes Exception catcher
      } catch(Exception e) {
          e.printStackTrace();
       }
   }
}

1 ответ

Решение

Во-первых, откуда работает ваш агент? Заметки? тогда это отличное место или на сервере? Если на сервере, вы должны убедиться, что библиотеки тоже там.

Один большой тест - это поместить библиотеки в код Агента.

Откройте вашу базу данных в Designer

Разверните базу данных> Код> Агенты

Откройте свой агент

Нажмите на архив

Нажмите Импорт> Архив

Нажмите кнопку "Обзор" (найдите папку с указанными банками)

Выберите банки, которые вы хотите

Нажмите Готово

Нажмите Сохранить (дайте ему скомпилироваться)

Закрыть и проверить

Если это работает, это связано с проблемами пути

---- Обновлено ----

Я добавил com.ibm.sbt.core / com.ibm.commons.xml com.ibm.commons.runtime com.ibm.commons httpcore httpclient jars-logons jars для регистрации агента в качестве архива

Я использовал ваш код и изменил совместимость рабочей области на Java1.5

Затем я изменил уровень безопасности на уровень 3.... вы должны попробовать то же самое, и если это не удастся, вы должны изучить конфликтующие классы Java.

import lotus.domino.AgentBase;
import lotus.domino.AgentContext;
import lotus.domino.Session;

import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;



public class JavaAgent extends AgentBase {

    public void NotesMain() {

        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();
            lotus.domino.Log log = session.createLog("SampleAgentSBT");
            log.openAgentLog();

            HttpClient httpclient = new DefaultHttpClient();
            try {
                HttpGet httpget = new HttpGet("http://www.google.com/");

                log.logAction("executing request " + httpget.getURI());

                // Create a response handler
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                String responseBody = httpclient.execute(httpget,
                        responseHandler);
                log.logAction("----------------------------------------");
                log.logAction(responseBody);
                log.logAction("----------------------------------------");

            } finally {
                // When HttpClient instance is no longer needed,
                // shut down the connection manager to ensure
                // immediate deallocation of all system resources
                httpclient.getConnectionManager().shutdown();
            }
            log.close();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }
}
Другие вопросы по тегам