elasticsearch,log4j2,websphere-liberty,Java,elasticsearch,Log4j2,Websphere Liberty" /> elasticsearch,log4j2,websphere-liberty,Java,elasticsearch,Log4j2,Websphere Liberty" />

Java WAS Liberty类加载器的问题

Java WAS Liberty类加载器的问题,java,elasticsearch,log4j2,websphere-liberty,Java,elasticsearch,Log4j2,Websphere Liberty,我对WAS Liberty类加载器有一个问题,我所做的一切似乎都无法解决它。问题似乎与我正在使用的log4j2有关 我运行的是16.0.0.4(刚刚从8.5.5.9升级过来,这里也存在此问题)。我正在尝试使用Primefaces 6.0创建一个Web应用程序,它连接到Elasticsearch 5.1.1 我向maven添加了以下依赖项: <dependency> <groupId>org.elasticsearch.client</groupId>

我对WAS Liberty类加载器有一个问题,我所做的一切似乎都无法解决它。问题似乎与我正在使用的log4j2有关

我运行的是16.0.0.4(刚刚从8.5.5.9升级过来,这里也存在此问题)。我正在尝试使用Primefaces 6.0创建一个Web应用程序,它连接到Elasticsearch 5.1.1

我向maven添加了以下依赖项:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>${library.elasticsearch.version}</version>
</dependency>
调试此行会在Elasticsearch(类:org.Elasticsearch.threadpool.threadpool line 203)中点击以下方法调用:

这会引发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):

我还试图让它“提供”。我目前正在构建一个war文件,但我也尝试将其作为ear,同样的结果

我是在Elasticsearch 5-alpha上遇到这个问题的:这里他们注意到他们想要创建一个服务器,因此没有将log4j2视为一个consern,但他们建议您使用RESTAPI(尽管在编写本文时,这对Java开发人员是不可用的)

所以问题是,我该怎么做?我应该使用RESTAPI(例如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加载了很多类,但不是我遇到麻烦的那个类——这是从我们的一个应用程序加载的。我试图在我们自己的应用程序中升级这个版本,但问题是一样的

您可能从父级WAS类加载器(而不是war的类加载器)获取log4j。可能有一种方法可以指定父类上次加载。很可能就是这样。您可以在服务器的jvm.options文件中设置-verbose:class,以打印出类的加载位置。如果log4j类来自Liberty的lib目录中的捆绑包,那么它是从服务器的框架中加载的——这可能是一个bug,但意味着您可以使用它来解决问题。否则,旧的log4j类将从您的应用程序或共享库中加载,您应该能够删除它们。我刚刚检查过,除非您使用z/OS特定功能,否则log4j不在Liberty中,因此更改为parent last以避免Liberty附带的副本是无效的。很可能您有两个log4j副本,正如@AndyMcCright所说的-verbose:class将有助于跟踪这一点。如果Elasticsearch为他们的RESTAPI招摇过市,那么您还可以使用WDT生成一个您可以使用的Java REST客户端。这可能更符合elastic search的建议。目前运行在Windows 7上,但一旦准备就绪,它应该部署在AIX上。我将尝试使用-verbose:class。我上一次试过了,只是忘了把它添加到描述中。它不起作用,但可能是我做错了。我更新了-verbose:class中的信息。我将把这个问题保留几天,看看是否有新的想法出现。您可能是从war的类加载器而不是war的类加载器的父级WAS中获取log4j。可能有一种方法可以指定父类上次加载。很可能就是这样。您可以在服务器的jvm.options文件中设置-verbose:class,以打印出类的加载位置。如果log4j类来自Liberty的lib目录中的捆绑包,那么它是从服务器的框架中加载的——这可能是一个bug,但意味着您可以使用它来解决问题。否则,旧的log4j类将从您的应用程序或共享库中加载,您应该能够删除它们。我刚刚检查过,除非您使用z/OS特定功能,否则log4j不在Liberty中,因此更改为parent last以避免Liberty附带的副本是无效的。很可能您有两个log4j副本,正如@AndyMcCright所说的-verbose:class将有助于跟踪这一点。如果Elasticsearch为他们的RESTAPI招摇过市,那么您还可以使用WDT生成一个您可以使用的Java REST客户端。这可能更符合elastic search的建议。目前运行在Windows 7上,但一旦准备就绪,它应该部署在AIX上。我将尝试使用-verbose:class。我上一次试过了,只是忘了把它添加到描述中。它不起作用,但可能是我做错了。我更新了-verbose:class中的信息。我会把这个问题保留几天,看看是否有新的想法出现。
org/apache/logging/log4j/Logger.debug(java/lang/String;java/lang/Object;)
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
...