为什么我的Jenkins插件找不到我的pom.xml依赖项?

Dav*_*ein 11 java maven jenkins

pom.xml有这种依赖:

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)

当我使用XMLSerializer它时抛出一个异常:java.lang.NoClassDefFoundError: nu/xom/Node

如果我在本地运行该类并将JAR添加到我的类路径中,一切都按预期工作.我正在运行这个类作为Jenkins插件,所以我不希望手动定义类路径 - 我认为这是Maven应该处理的.

重要的是要注意Jenkins插件要求我上传hpi从Maven创建的文件.它不是基于输出运行的jar.如果我继续使用Jenkins盒子并手动放入xom JAR WEB-INF/libs,它就可以了.但显然这意味着这个插件不适合其他人,这是弄巧成拙的.

这是导致错误的最小代码:https://github.com/DaveStein/parser-sample

自述文件具有完全的重复步骤.

关于所选答案注意事项我的样本回购的PR让我大部分时间都能到达我需要的地方.我确实有一些必须解决的其他问题,但JSONObject冲突是核心问题.我按照Jesse的PR建议取出了所有GlobalConfiguration.可能与未来查看者有关的唯一其他问题是在使用xom显式依赖时使用高于1.626的更高版本时的一些故障org.jenkins-ci.plugins.

Jes*_*ick 3

Jenkins 核心包json-lib。(分叉副本,对于这个问题来说并不重要。)它不捆绑可选的依赖项\xc2\xb9 XOM,无论它是什么。当您的插件加载时XmlSerializer.class,它由 Jenkins 核心的类加载器定义,然后尝试链接到nu.xom.Node. 由于这在 \xe2\x80\x94 的定义加载器中不可用,因此XmlSerializerJenkins 核心类加载器(或多或少jenkins.war!/WEB-INF/lib/*.jar)\xe2\x80\x94 会出现错误。事实上,具有该名称的类重要,请原谅双关语。

\n\n

如果您的插件需要使用自己的类版本,这些类通常捆绑在 Jenkins 核心中并隐式暴露给插件,那么它不仅需要捆绑这些 JAR(常规作用域的compileMaven 依赖项足以达到此目的),而且还需要使用选项。pluginFirstClassLoader在尝试这样做之前,您最好彻底理解 Java 类加载语义,否则您将迷失在神秘的\xc2\xb2 的迷宫ClassCastExceptionLinkageErrors 的迷宫中。

\n\n

顺便说一句,mvn hpi:run通常用于迭代测试插件代码的命令不会模拟实际的类加载机制。因此,如果您在该领域使用pluginFirstClassLoader或任何其他技巧,请始终通过在示例 Jenkins 实例中(重新)安装 来仔细检查生成的类加载行为*.hpi,例如使用/pluginManager/advanced、 或install-pluginCLI 命令。从你的描述来看,你已经这样做了(也许没有意识到hpi:run)。

\n\n

\xc2\xb9 这里的原罪是optional依赖关系的使用。json-lib应该定义一个与和json-lib-xom具有硬依赖关系的独特工件。这将确保任何给定的类加载器都可以看到json-libxomXmlSerializer 及其依赖项,或者两者都看不到。

\n\n

\xc2\xb2 JDK-6273389上没有进展没有进展,唉。标记为重复项,但我不确定它是什么重复项。理论上,Java 9 模块通过施加如此繁重的限制,使得像 Jenkins 这样的应用程序无法使用该模块系统,从而使像这样的问题变得过时\xe2\x80\x94。

\n