【问题标题】:Weblogic Guava issue when deploying application部署应用程序时出现 Weblogic Guava 问题
【发布时间】:2012-11-13 14:30:40
【问题描述】:

我正在尝试将应用程序部署到 weblogic 服务器,但出现以下错误。
我的类路径中有 guava.jar,我尝试了从 10 起尝试的所有最新版本。有人可以帮我解决这个问题吗?

    <Error> <Console> <BEA-240003> <Administration Console encountered the following error: weblogic.application.ModuleException: [HTTP:101216]Servlet: "action" failed to preload on startup in Web application: "...".
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;
            at com.google.common.cache.LocalCache.<clinit>(LocalCache.java:155)
            at com.google.common.cache.LocalCache$LocalManualCache.<init>(LocalCache.java:4750)
            at com.google.common.cache.LocalCache$LocalLoadingCache.<init>(LocalCache.java:4858)
            at com.google.common.cache.CacheBuilder.build(CacheBuilder.java:739)
            at com.my.app.servers.UserServer.<clinit>(UserServer.java:42)
            at com.my.app.ActionServlet.setAppProperties(DesActionServlet.java:207)
            at com.my.app.ActionServlet.init(DesActionServlet.java:167)
            at javax.servlet.GenericServlet.init(GenericServlet.java:240)
            at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:299)
            at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:250)
            at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
            at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
            at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
            at weblogic.servlet.internal.StubSecurityHelper.initServletInstance(StubSecurityHelper.java:94)
            at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:82)
            at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:74)
            at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:60)
            at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:34)
            at weblogic.servlet.internal.ServletStubImpl.initStubLifecycleHelper(ServletStubImpl.java:624)
            at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:565)
            at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:1874)
            at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:1848)
            at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1738)
            at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:2740)
            at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1704)
            at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:781)
            at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:213)
            at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:208)
            at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:35)
            at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:70)
            at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:212)
            at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:111)
            at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
            at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:213)
            at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:208)
            at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:35)
            at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:70)
            at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:24)
            at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:729)
            at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:35)
            at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258)
            at weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:48)
            at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
            at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
            at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:582)
            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:335)
            at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:844)
            at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1253)
            at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:440)
            at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:163)
            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:545)
            at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
            at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)



Caused by: java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;

【问题讨论】:

  • 令我困惑的是,存在一些番石榴类。你在使用 ProGuard 吗?你的构建系统是什么?
  • 使用eclipse,在weblogic控制台上部署。
  • 更新!!最后我从@Chris Povirk 得到了解决方案的问题,但我解决了here

标签: java deployment weblogic guava


【解决方案1】:

看起来您运行的 Guava 版本与编译时所用的版本不同。可能您正在运行 多个 版本的番石榴,并且随机得到错误的版本。如果您的其他依赖项之一错误地捆绑了 Guava,则可能会发生这种情况。

要弄清楚MoreExecutors 的这个副本来自哪里,我听说你可以通过在UserServer 中使用这个sn-p 来反思地找到它:

MoreExecutors.class.getProtectionDomain().getCodeSource().getLocation()

【讨论】:

  • 不知道我应该怎么做,你能给我更多的细节吗? tnx 磨坊!
  • @ElyeM。在com.my.app.servers.UserServer 或更可能在com.my.app.ActionServlet.init() 第167 行之前的静态初始化块中添加System.out.println(MoreExecutors.class.getProtectionDomain().getCodeSource().getLocation()) 之类的内容(或使用您选择的日志记录系统),因此它在抛出异常之前执行。这将记录包含已加载 MoreExecutors 类的 jar 的“路径”,并帮助您摆脱 jar 冲突。
  • 好的,首先谢谢!我做到了,它来自 com.google.common_1.0.0.0_0-6.jar ,它必须来自 Guava-11.0.2.jar ,你认为我应该怎么做?我想我不能只删除 com.google.common_1.0.0.0_0-6.jar 文件,因为它需要服务器,您有什么建议吗?
  • 您可以尝试blog.eisele.net/2011/12/…“Clazzloading 或 Oracle 和 RedHat 与 Google”下的 weblogic-application.xml 建议
  • @ElyeM。 Chris 链接的解决方案应该可以解决您的问题,因为它是一个类加载问题:WLS 打包看起来像是旧版和重新打包的 google-collections 版本,已被 Guava 取代;默认情况下,您的应用程序将“看到” WLS 在其打包的类之前加载的类,这就是您最终使用错误的MoreExecutors 版本的原因。通过从应用程序类加载器过滤 Guava 导出的包,您将确保使用来自打包在您的应用程序中的所有 Guava 类,而不是 WLS 本身中的。
【解决方案2】:

这似乎是一个反复出现的问题([1][2][3])。我自己也偶然发现了同样的问题。 Weblogic 首先加载它自己的(过时的)番石榴库版本,与您的应用程序版本相冲突。

解决方案是将prefer-application-packages 添加到您的weblogic.xmlweblogic-application.xml

<wls:container-descriptor>
    <wls:prefer-application-packages>
            <wls:package-name>com.google.common.*</wls:package-name>
    </wls:prefer-application-packages>
</wls:container-descriptor>

【讨论】:

    【解决方案3】:

    这是一个 WAR 项目吗?或者它只是一个 EJB jar?

    如果是最新的,您有几个选择:

    • 将您的 jar 文件包装到 EAR 中并在其中交付 Guava 的 jar
    • 将 Guava 的 jar 添加到你的 AS 的 library 文件夹中
    • 将您的 jar 文件与 Guava 的文件合并。例如,如果您是 Maven 专家,则可以使用 Maven Shade Plugin

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题。我可以通过将带有 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"                            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>
      

      【讨论】:

        【解决方案5】:

        我也遇到了这个问题,不幸的是改变 weblogic.xml 对我不起作用。起作用的是,将 guava-14.0.1.jar 放入 $JAVA_HOME/jre/lib/endorsed (如果该目录不存在,则创建此目录。)

        另外一个警告:起初我尝试使用更新的 guava-18 - 这导致了兼容性问题(MapMaker.makeComputingMap 上的 IllegalAccessError - 更多详细信息here)。 Guava 14.0.1 似乎达到了我的最佳选择 - MapMaker 类足够老,可以满足 WebLogic,而 MoreExecutors 类足够新,可以让 Cassandra Java 驱动程序工作(这就是我偶然发现这个问题的原因。)

        【讨论】:

          【解决方案6】:

          我设法使用两个文件解决了这个问题:ear 中的 weblogic-application.xml 和 war 中的 weblogic.xml

          这是ear中的weblogic-application.xml -> src/main/application/META-INF/

          <?xml version="1.0" encoding="UTF-8"?>
          <wls:weblogic-application
              xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.4/weblogic-application.xsd">
              <wls:prefer-application-packages>
                  <wls:package-name>com.google.common.*</wls:package-name>
              </wls:prefer-application-packages>
          </wls:weblogic-application>
          

          这是战争中的 weblogic.xml -> src/main/webapp/WEB-INF/

          <?xml version="1.0" encoding="UTF-8"?>
          <wls:weblogic-application
              xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.4/weblogic-application.xsd">
              <wls:prefer-application-packages>
                  <wls:package-name>com.google.common.*</wls:package-name>
              </wls:prefer-application-packages>
          </wls:weblogic-application>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-25
            • 1970-01-01
            • 2020-03-05
            • 1970-01-01
            • 2017-10-27
            • 2014-11-25
            • 2013-09-30
            • 2020-10-22
            相关资源
            最近更新 更多