与WebLogic上的Jenkins的LinkageError

Jes*_*ynn 6 java jenkins weblogic12c

我在WebLogic 12c上运行Jenkins 1.613,在JBoss EAP 6.3上运行.我设法让Jenkins的email-ext插件在JBoss上运行.但是,每当我使用诸如$ PROJECT_NAME之类的令牌时,电子邮件扩展插件在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)
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 根据我对此跟踪的理解,问题是Multimaps类的冲突副本是否已加载?是对的吗?
  2. 为什么会涉及多个类加载器(AntClassLoader2和AppClassLoader)?应该不是这样的情况,一旦类加载器找到所需的类,它只是"返回"该类,并且只有在找不到类时才将类加载委托给父类加载器?
  3. 为什么我的设置在JBoss中工作但在WebLogic中没有?
  4. 可以做些什么来解决这个问题?我已经尝试将Guava 11放在tokenmacro插件目录的WEB-INF中,但它没有帮助.我也尝试过和番石榴13一样.

可能有用的其他信息:

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

Gus*_*ave 3

1.) 我也这么认为。

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

因此,如果两个类具有相同的名称但不同的类加载器,则它们被视为不同。

当两个应用程序“接触”或容器提供类时就会出现问题。我猜测问题出在 WebLogic 提供的 Guava 上。

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

2b(类加载器委托):通常情况正好相反:总是询问父类加载器,如果它找不到该类,请尝试自己查找。但整个故事要复杂得多(要了解更多信息,请参阅https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html,也许 WebLogic 也有一些类似的文档)。

3)作为第一个猜测,我会检查WebLogic(根据您的实例配置)是否提供Guava。

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