Java WebLogic上Jenkins的LinkageError
Jenkins 1.613运行在WebLogic 12c上,也运行在JBoss EAP 6.3上。我已经设法让Jenkins email ext插件在JBoss上运行。然而,每当我使用$PROJECT_NAME这样的标记时,email-ext插件在WebLogic上就失败了(在JBoss上工作得非常好,我应该再次强调) 我得到了下面的stacktrace,这似乎表明tokenmacro插件存在一些问题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
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)
问题:
- 已安装的令牌宏插件版本为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可以独立运行-为什么不使用该功能?