Java WebLogic上Jenkins的LinkageError

Java WebLogic上Jenkins的LinkageError,java,jenkins,weblogic12c,Java,Jenkins,Weblogic12c,Jenkins 1.613运行在WebLogic 12c上,也运行在JBoss EAP 6.3上。我已经设法让Jenkins email ext插件在JBoss上运行。然而,每当我使用$PROJECT_NAME这样的标记时,email-ext插件在WebLogic上就失败了(在JBoss上工作得非常好,我应该再次强调) 我得到了下面的stacktrace,这似乎表明tokenmacro插件存在一些问题 java.lang.LinkageError: loader constraint viola

Jenkins 1.613运行在WebLogic 12c上,也运行在JBoss EAP 6.3上。我已经设法让Jenkins email ext插件在JBoss上运行。然而,每当我使用$PROJECT_NAME这样的标记时,email-ext插件在WebLogic上就失败了(在JBoss上工作得非常好,我应该再次强调)

我得到了下面的stacktrace,这似乎表明tokenmacro插件存在一些问题

java.lang.LinkageError: loader constraint violation: when resolving method
"com.google.common.collect.Multimaps.newListMultimap( java/util/Map; com/google/common/base/Supplier;) com/google/common/collect/ListMultimap;"

the class loader (instance of hudson/ClassicPluginStrategy$AntClassLoader2) of the current class, org/jenkinsci/plugins/tokenmacro/Tokenizer,

and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, com/google/common/collect/Multimaps,

have different Class objects for the type ap; com/google/common/base/Supplier;) com/google/common/collect/ListMultimap; used in signature

at org.jenkinsci.plugins.tokenmacro.Tokenizer.find(Tokenizer.java:109)
at org.jenkinsci.plugins.tokenmacro.TokenMacro.expand(TokenMacro.java:167)
at org.jenkinsci.plugins.tokenmacro.TokenMacro.expandAll(TokenMacro.java:233)
at hudson.plugins.emailext.plugins.ContentBuilder.transformText(ContentBuilder.java:71)
at hudson.plugins.emailext.ExtendedEmailPublisher.setSubject(ExtendedEmailPublisher.java:659)
问题:

  • 根据我对该跟踪的理解,问题在于已加载的Multimaps类存在冲突副本?是这样吗
  • 为什么会涉及多个类加载器(AntClassLoader2和AppClassLoader)?当类加载器找到所需的类时,它只是“返回”该类,并且仅当它没有找到该类时才将类加载委托给父类加载器,这难道不应该吗
  • 为什么我的设置可以在JBoss中工作,而不能在WebLogic中工作
  • 如何解决这个问题?我曾尝试将Guava11放在tokenmacro插件目录的WEB-INF中,但没有帮助。我也尝试过同样的番石榴13
  • 可能有用的其他信息:

    • 已安装的令牌宏插件版本为1.10
    • 安装的电子邮件扩展插件版本为2.40.5
    • 在我的jenkins.war中,我有一个weblogic.xml文件,其中wls:preferve-web-inf-classes设置为true
    • 我也会这么想

      2.a(多类加载器):像JBoss这样的应用程序容器中有特殊的类加载器。它们用于在不同的应用程序中分离类。您应该能够在应用程序中使用类的任何版本,而不依赖于在不同应用程序中使用的版本

      因此,如果两个类具有相同的名称但类装入器不同,则认为它们是不同的

      当两个应用程序“接触”或容器提供类时,就会出现问题。我猜问题在于WebLogic提供的番石榴

      此外,Jenkins本身就是一种应用程序容器,它必须分离不同的插件,因此AntClassLoader2

      2b(类加载器委托):通常情况正好相反:始终询问父类加载器,如果它找不到类,请尝试自己找到它。但整个故事要复杂得多(为了了解情况,可能还有一些类似的WebLogic文档)

      3) 首先,我想检查WebLogic(在您的实例配置时)是否提供Guava


      4) 我将尝试隔离问题,并通过编写一个使用供应商的小型Web应用程序使其可复制。也许我会搜索并阅读有关WebLogic中如何处理类加载的文档。

      我能够测试电子邮件ext tempate,但无法发送。

      您应该在WebLogic类之前强制加载应用程序类 您可以通过使用指令prefere application packages强制实现这一点,如下所述:

      这是我的一个生产应用程序提取的示例: 文件放在EAR包中的application/META-INF/weblogic-application.xml处

      <?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://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.0/weblogic-application.xsd">
          <classloader-structure>
              <module-ref>
                  <module-uri>j2ee-connector.rar</module-uri>
              </module-ref>
              <module-ref>
                  <module-uri>ejb-1.0-SNAPSHOT.jar</module-uri>
              </module-ref>
          </classloader-structure>
           <prefer-application-packages>
              <package-name>org.slf4j.*</package-name>
              <package-name>org.apache.commons.logging.*</package-name>
              <package-name>org.apache.commons.io.*</package-name>
               <package-name>ch.qos.logback.*</package-name>
          </prefer-application-packages>
          <prefer-application-resources>
              <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name>
          </prefer-application-resources>
      </weblogic-application>
      
      
      j2ee-connector.rar
      ejb-1.0-SNAPSHOT.jar
      org.slf4j*
      org.apache.commons.logging*
      org.apache.commons.io*
      回写*
      org/slf4j/impl/StaticLoggerBinder.class
      
      这里的相关部分是首选应用程序包和可选的首选应用程序资源(取决于代码的行为)

      放在那里com.google.common*

      我知道詹金斯是一场普通的战争,而不是一只耳朵
      因此,您可以编写一个包含war的maven项目,然后定义如何在ear中加载包,或者查看文档,使用weblogic.xml和文档化的PreferWeb inf类直接修改war描述符,并将其设置为true。

      主题外问题:Jenkins可以独立运行-为什么不使用该功能?