【问题标题】:Guava 15.0 jar conflict in WebLogic 12cWebLogic 12c 中的 Guava 15.0 jar 冲突
【发布时间】:2013-11-06 15:39:06
【问题描述】:

我在部署在 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 类加载器过滤,如 here 所述,以解决 WebLogic 12c 中的运行时冲突,因为它似乎重新打包了旧版本的库。这在 guava 14.0.1 中一直有效,但在 15.0 中没有。

据我所知,更喜欢 com.google.common.* 包应该包含所有内容。这个 Finalizer 类是否在类加载器过滤发生之前做了一些特殊的事情,从而尝试加载似乎具有不同 API 的旧版本?

是否有替代解决方案使用与应用程序一起打包的 guava-15.0.jar,而不是与服务器捆绑的内容?

【问题讨论】:

    标签: guava weblogic12c


    【解决方案1】:

    修复this one 后出现的open issue #1527 针对此问题(Guava 15 无法部署到任何 JEE6 容器)。请加注星标和/或评论并等待修复(comment #33 建议版本 15.0.1 可能会在不久的将来发布)。

    编辑: 同时,the issue was resolvednew maven release

    关于 JEE6 / CDI 1.0 的说明

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

    如果您在 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 或wait until 16 is released

    【讨论】:

    • 感谢您的信息。我通读了这些线程,并尝试从 guava-15.0.jar 中删除 beans.xml,因为 WebLogic 12c 是 JEE6 服务器,这似乎确实解决了问题。我想现在最好的办法就是恢复到 14.0.1,直到有一个 15 的新版本无需修改即可工作。
    【解决方案2】:

    作为附加信息,由于 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

    【讨论】:

    • 包名应该是com.google.common
    • 感谢 Zeta 指出这一点。不知道我从哪里得到组织部分。刚刚根据您的建议进行了编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2023-02-18
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多