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 而不是与服务器捆绑的内容?

4

2 回答 2

9

有一个未解决的问题 #1527针对此问题(Guava 15 无法部署到任何 JEE6 容器),该问题在修复此问题后发生。请加注星标和/或评论并等待修复(评论 #33建议版本 15.0.1 可能会在不久的将来发布)。

编辑: 同时,新的 Maven 版本解决了这个问题:

关于 JEE6 / CDI 1.0 的说明

在 Guava 15.0 中添加了一个解决方法,使其与 CDI 1.1(用于 JEE7 容器)兼容,导致带有 CDI 1.0(用于 JEE6 容器)的 Guava 出现问题。

如果您在 CDI 1.0 环境中使用 Guava,则应使用 guava-15.0-cdi1.0.jar 而不是普通的 Guava jar。在 Maven 中,可以将依赖项指定为:

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

如果要同时部署在 JEE 6 和 7 服务器上,则必须使用 Guava 13 或等到 16 发布

于 2013-10-28T04:12:17.323 回答
3

作为附加信息,由于 WL 和 Guava 之间的冲突(已尝试使用 Guava 的 11 和 18 版),我在升级到 Weblogic 12c 时遇到了类似的问题。

我发现解决方案是明确偏爱我的应用程序的库。我在我的 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以获取参考。

于 2015-02-27T21:30:01.017 回答