java.lang.NoSuchMethodError 在弹性搜索启动期间
java.lang.NoSuchMethodError during Elastic search start
我在 EAR 中部署时遇到以下错误。弹性搜索连接期间出现异常。在我的 EAR 中,我使用的是番石榴版本 18。这是 ES 2.0+ 的推荐版本(我使用的是 ES 2.3.3)
weblogic.application.ModuleException: java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
at weblogic.application.internal.flow.ModuleStateDriver.next(ModuleStateDriver.java:216)
.....
Caused By: java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
at org.elasticsearch.threadpool.ThreadPool.<clinit>(ThreadPool.java:190)
at org.elasticsearch.client.transport.TransportClient$Builder.build(TransportClient.java:131)
at com.ventyx.servicesuite.dispatcher.ESClientMgr.connect(ESClientMgr.java:80)
.....
在大多数搜索中提到这是因为 guava jars 冲突。
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor
所以我添加了 -verbose:class 作为 Java 选项,同时 运行 我的 weblogic 查看是否加载了旧版本的番石榴
但令我惊讶的是,它没有发现任何番石榴罐被加载。但我怀疑 weblogic.server.merged.jar 中预打包了 google 库。
所以我的问题是
有什么方法可以告诉容器使用应用程序中的 jar 文件而不是 weblogic 的?
我可以通过将带有 prefer-application-packages 的 weblogic-application.xml 添加到我的 EAR 来解决这个问题。
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.0/weblogic-application.xsd">
<prefer-application-packages>
<package-name>com.google.common.*</package-name>
</prefer-application-packages>
</weblogic-application>
我在 EAR 中部署时遇到以下错误。弹性搜索连接期间出现异常。在我的 EAR 中,我使用的是番石榴版本 18。这是 ES 2.0+ 的推荐版本(我使用的是 ES 2.3.3)
weblogic.application.ModuleException: java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
at weblogic.application.internal.flow.ModuleStateDriver.next(ModuleStateDriver.java:216)
.....
Caused By: java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
at org.elasticsearch.threadpool.ThreadPool.<clinit>(ThreadPool.java:190)
at org.elasticsearch.client.transport.TransportClient$Builder.build(TransportClient.java:131)
at com.ventyx.servicesuite.dispatcher.ESClientMgr.connect(ESClientMgr.java:80)
.....
在大多数搜索中提到这是因为 guava jars 冲突。
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor
所以我添加了 -verbose:class 作为 Java 选项,同时 运行 我的 weblogic 查看是否加载了旧版本的番石榴
但令我惊讶的是,它没有发现任何番石榴罐被加载。但我怀疑 weblogic.server.merged.jar 中预打包了 google 库。
所以我的问题是 有什么方法可以告诉容器使用应用程序中的 jar 文件而不是 weblogic 的?
我可以通过将带有 prefer-application-packages 的 weblogic-application.xml 添加到我的 EAR 来解决这个问题。
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.0/weblogic-application.xsd">
<prefer-application-packages>
<package-name>com.google.common.*</package-name>
</prefer-application-packages>
</weblogic-application>