Попытка использовать SBT из Java-агента Domino завершается ошибкой NoSuchMethodError: org/apache/http/protocol/BasicHttpContext.‹init›()V

ОБНОВЛЕНИЕ 30 ОКТЯБРЯ, см. внизу вопроса.

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

Перемещая код в локальный агент Notes Java (агент помещается в локальную базу данных), я в первую очередь скопировал 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)

Searching StackOverflow and other sites shows that others has seen similar problems with mixed versions of Apache's HttpClient (typically people has been using httpclient 4.0.1, and the problem went away replacing it with httpclient 4.1). The SBT includes httpclient-4.2.1.jar is that file is what I have copied to Lotus Notes's C:\Program Files (x86)\IBM\Lotus\Notes\jvm\lib\ext.

Мне кажется, что 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 г. - Найден образец, который, возможно, идет по тому же пути. Следующий код представляет собой полный агент Notes Java с основным кодом непосредственно из примера кода 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();
       }
   }
}

person Bob Voith    schedule 29.10.2013    source источник
comment
КСТАТИ; Я только что попытался заменить httpclient, httpcore и т. д. файлами из каталога SBT com.ibm.sbt.libs.domino\lib-catalog. К сожалению тот же результат   -  person Bob Voith    schedule 29.10.2013


Ответы (1)


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

Один отличный тест — поместить библиотеки в код Агента.

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

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

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

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

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

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

Выберите нужные банки

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

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

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

Если это сработает, дело в проблемах с путями.

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

Я добавил com.ibm.sbt.core/com.ibm.commons.xml com.ibm.commons.runtime com.ibm.commons httpcore httpclient commons-log 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 {

        }
    }
}
person Paul Bastide    schedule 29.10.2013
comment
Привет Павел и спасибо за ответ. Агент запускается из клиента Lotus Notes, а агент Java помещается в локальную базу данных. Сервер еще не задействован. И да, я также попытался включить все упомянутые jar-файлы непосредственно в Java-агент. Кроме того, я попытался включить jar-файлы в библиотеку Java Script, в которую я поместил код. Я также попытался разместить файлы Java внутри агента. На данный момент трассировка стека для всех вариантов. Похоже, что JVM Notes каким-то образом предпочитает собственную версию файлов jar httpclient/httpcore. - person Bob Voith; 29.10.2013
comment
Еще один результат поиска. Я вижу, что в моем клиенте Notes 9 Designer установлена ​​следующая версия httpcore 4.0.1; C:\Program Files (x86)\IBM\Lotus\Notes\osgi\shared\eclipse\plugins\org.apache.wink_1.1.2.20130301-1506\lib\httpcore-4.0.1.jar и C:\Program Files (x86)\IBM\Lotus\Notes\framework\shared\eclipse\plugins\org.apache.wink_1.1.2.20130301-1506\lib\httpcore-4.0.1.jar Теперь я не уверен, что эти файлы когда-нибудь попадут в играть в диспетчере клиентских агентов Notes JVM или нет. Ради интереса я попытался заменить содержимое папки 4.0.1 содержимым SBT 4.2.1. - person Bob Voith; 29.10.2013
comment
вы изменили ограничения на запуск агента? - person Paul Bastide; 29.10.2013
comment
Пол, да, я также пытался повысить безопасность агента до 3 (= Разрешить ограниченные операции...). - person Bob Voith; 30.10.2013
comment
Павел, БОЛЬШОЕ СПАСИБО, что нашли время на тест. Просто иметь кого-то, тестирующего код и подтверждающего, что он действительно работает, очень ценно. Это означает, что мне просто нужно выследить проблему, пока она не исчезнет. В моем случае оказалось, что у меня возникла проблема со стандартными файлами jar, которые там были. Я вынул все, и при каждом перезапуске Notes обращал внимание на то, что jar Designer сообщал об отсутствии. Сделав это, он начал работать! Я предполагаю, что причиной была какая-то старая и кэшированная последовательность, которая не слишком нравилась моему текущему коду. Фиксация заказа была хитростью. - person Bob Voith; 30.10.2013