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 12c での実行時の競合を解決するために、こちらで説明されているように、weblogic.xml ファイルで WebLogic prefer-application-packages クラスローダー フィルタリングを既に使用しています。これは guava 14.0.1 では機能していましたが、15.0 では機能しません。

私が知る限り、com.google.common.* パッケージを優先すると、すべてが含まれるはずです。この Finalizer クラスは、クラスローダのフィルタリングが発生する前に何か特別なことを行い、それによって別の API を持っているように見える古いバージョンをロードしようとしていますか?

サーバーにバンドルされているものの代わりに、アプリケーションにパッケージ化された guava-15.0.jar を使用する代替ソリューションはありますか?

4

2 に答える 2

9

この問題を修正した後に発生した、この問題 (Guava 15 は JEE6 コンテナーにデプロイできません) を対象とする未解決の問題 #1527があります。スターやコメントを付けて、修正をお待ちください (コメント #33は、バージョン 15.0.1 が近い将来にリリースされる可能性があることを示唆しています)。

編集: 一方、問題は新しい maven リリースによって解決されました:

JEE6 / CDI 1.0 に関する注意事項

CDI 1.1 (JEE7 コンテナーで使用) と互換性を持たせるために Guava 15.0 に追加された回避策により、CDI 1.0 (JEE6 コンテナーで使用) で Guava に問題が発生しました。

CDI 1.0 環境で Guava を使用している場合は、通常の Guava jar の代わりに guava-15.0-cdi1.0.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 に答える