WebLogic 12c中的Guava 15.0 jar冲突

5

我在一个部署在WebLogic 12c上的应用程序中将guava从14.0.1升级到15.0,但是在部署过程中出现了java.lang.NoSuchMethodException错误,我一直无法解决:

Caused By: java.lang.NoSuchMethodException: com.google.common.base.internal.Finalizer.startFinalizer(java.lang.Class, java.lang.ref.ReferenceQueue, java.lang.ref.PhantomReference)
    at java.lang.Class.getMethod(Class.java:1624)
    at com.google.common.base.FinalizableReferenceQueue.getStartFinalizer(FinalizableReferenceQueue.java:302)
    at com.google.common.base.FinalizableReferenceQueue.<clinit>(FinalizableReferenceQueue.java:90)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:266)
    at com.oracle.injection.provider.weld.BasicResourceLoader.classForName(BasicResourceLoader.java:27)
    at org.jboss.weld.bootstrap.BeanDeployer.loadClass(BeanDeployer.java:107)
    at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:77)
    at org.jboss.weld.bootstrap.BeanDeployer.addClasses(BeanDeployer.java:135)
    at org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:184)
    at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:349)
    at com.oracle.injection.provider.weld.WeldInjectionContainer.deploy(WeldInjectionContainer.java:99)
    at com.oracle.injection.integration.CDIAppDeploymentExtension.initCdi(CDIAppDeploymentExtension.java:68)
    at com.oracle.injection.integration.CDIAppDeploymentExtension.activate(CDIAppDeploymentExtension.java:47)
    at weblogic.application.internal.flow.AppDeploymentExtensionFlow.activate(AppDeploymentExtensionFlow.java:37)
    at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:729)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
    at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258)
    at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:61)
    at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
    at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80)
    at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:586)
    at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:148)
    at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:114)
    at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:339)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:846)
    at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1275)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:442)
    at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:176)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:195)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:13)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68)
    at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:550)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:295)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:254)

我已经在我的weblogic.xml文件中使用了WebLogic prefer-application-packages类加载器过滤器,如此处所述,以解决WebLogic 12c中的运行时冲突,因为它似乎重新打包了库的旧版本。这在guava 14.0.1中有效,但在15.0中无效。

据我所知,优先使用com.google.common.*包应该包括所有内容。这个Finalizer类是否执行某些特殊操作,发生在类加载器过滤器之前,因此尝试加载具有不同API的旧版本?

是否有替代方案可以使用应用程序打包的guava-15.0.jar而不是与服务器捆绑的版本?

2个回答

9

有一个已经公开的1527号问题,针对这个问题(Guava 15无法部署到任何JEE6容器),在修复另一个问题后出现。请点赞或评论并等待修复(第33条评论建议未来可能发布版本15.0.1)。

编辑: 与此同时,问题已经得到解决,通过新的Maven发布

A note on JEE6 / CDI 1.0

A workaround added in Guava 15.0 to make it compatible with CDI 1.1 (used in JEE7 containers) caused problems for Guava with CDI 1.0 (used in JEE6 containers).

If you're using Guava in a CDI 1.0 environment, you should use guava-15.0-cdi1.0.jar instead of the normal Guava jar. In Maven, the dependency can be specified as:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>15.0</version>
  <classifier>cdi1.0</classifier>
</dependency>

如果你想在JEE 6和7服务器上部署,你必须使用Guava 13或者等待16发布


谢谢提供的信息。我阅读了这些线程,并尝试从guava-15.0.jar中删除beans.xml,因为WebLogic 12c是一个JEE6服务器,这似乎解决了问题。我想现在最好的做法就是回退到14.0.1版本,直到有一个可以无需修改工作的15版本发布。 - eggilbert

3
作为额外的信息,我在升级到Weblogic 12c时遇到了类似问题,原因是WL和Guava之间存在冲突(尝试使用Guava的11和18版本均未成功)。
我发现解决方案是明确优先使用我的应用程序库。我在weblogic.xml中进行了设置:
<prefer-application-packages>
  <package-name>com.google.common</package-name>
</prefer-application-packages>

参考http://docs.oracle.com/middleware/1212/wls/WLPRG/classloading.htm#WLPRG315


包名应该是<package-name>com.google.common</package-name>。 - Zeta
感谢Zeta指出这一点。不知道我哪里搞错了org部分。按照您的建议进行了修改。 - Ric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接