Попытка использовать 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 {
}
}
}