我遇到了WAS Liberty类加载器的问题,我似乎无法解决它。问题似乎与我正在使用的log4j2有关。
我正在运行16.0.0.4(刚刚从8.5.5.9升级,此问题也存在)。我尝试使用连接到Elasticsearch 5.1.1的Primefaces 6.0创建一个webapp。
我已将以下依赖项添加到maven:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>${library.elasticsearch.version}</version>
</dependency>
在路上的某个地方,我需要做以下事情:
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
调试此行会在Elasticsearch中调用以下方法调用(类:org.elasticsearch.threadpool.ThreadPool第203行):
logger.debug("created thread pool: {}", entry.getValue().formatInfo(executorHolder.info));
抛出java.lang.NoSuchMethodError:
org/apache/logging/log4j/Logger.debug(java/lang/String;java/lang/Object;)
通常我们使用log4j 2.2,但我已经包含log4j2 2.7,如此处所述(Elasticsearch v5.0使用2.6.2,v5.1使用2.7):https://discuss.elastic.co/t/issue-with-elastic-search-5-0-0-noclassdeffounderror-org-apache-logging-log4j-logger/64262/2
我也尝试过#34;提供&#34;。我目前正在建立一个战争文件,但我也尝试将其作为耳朵,同样的结果。
我在Elasticsearch 5-alpha上遇到了这个问题:https://github.com/elastic/elasticsearch/issues/19415这里他们注意到他们想创建一个服务器,因此没有看到log4j2作为consern,但是他们建议你改用REST API (尽管在撰写本文时,这对Java开发人员来说并不适用)。
所以问题是,我该怎么办?我应该使用REST API(例如Jest(https://github.com/searchbox-io/Jest/tree/master/jest))还是?...
在Liberty外部运行独立代码时,我的代码运行正常。
更新
Liberty的部分似乎包含log4j v2.2:
class load: org.apache.logging.log4j.core.appender.routing.Route from: file:/C:/deploy/liberty/workarea/org.eclipse.osgi/60/data/cache/com.ibm.ws.app.manager_0/.cache/lib/log4j-core-2.2.jar
...
它从这个jar中加载了很多类,但不是我遇到麻烦的那个 - 这是从我们的应用程序加载的。我试图在我们自己的应用程序中碰撞版本,但同样的问题。