我的pom.xml
有这种依赖关系:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
当我使用XMLSerializer
时,它会引发异常:java.lang.NoClassDefFoundError: nu/xom/Node
如果我在本地运行该类并将JAR添加到我的类路径中,一切都按预期工作。我正在运行这个类作为Jenkins插件,所以我不希望手动定义类路径 - 我认为这是Maven应该处理的。
重要的是要注意Jenkins插件要求我上传从Maven创建的hpi
文件。它没有基于输出jar
运行。如果我继续使用Jenkins框并手动将xom JAR放入WEB-INF/libs
,它就可以了。但显然这意味着这个插件不适合其他人,这是弄巧成拙的。
以下是导致错误的最小代码:https://github.com/DaveStein/parser-sample
自述文件有完全的重复步骤。
关于所选答案的说明
我的样品回购的公关让我大部分时间都到达了我需要的地方。我确实有一些必须解决的其他问题,但JSONObject冲突是核心问题。我按照Jesse的PR建议取出了所有GlobalConfiguration。可能与未来查看者有关的唯一其他问题是使用xom
作为显式依赖时的一些小故障,同时在本帖时使用org.jenkins-ci.plugins
的更高版本而不是1.626。
答案 0 :(得分:2)
Jenkins核心包json-lib
。 (分叉副本,并不意味着这个问题的目的。)它不捆绑可选的依赖关系¹XOM,无论是什么。当您的插件加载XmlSerializer.class
时,它会由Jenkins核心的类加载器定义,然后它会尝试链接诸如nu.xom.Node
之类的类。由于这在XmlSerializer
的定义加载器中不可用 - Jenkins核心类加载器(或多或少jenkins.war!/WEB-INF/lib/*.jar
) - 您收到错误。在您的插件类加载器中可以访问该名称的类这一事实无关紧要,请原谅双关语。
如果你的插件需要使用通常捆绑在Jenkins核心中并隐式暴露给插件的类本身,那么它不仅需要捆绑这些JAR(常规compile
- 作用域的Maven依赖关系就足够了那个目的),但也要使用pluginFirstClassLoader
option。在尝试这样做之前,您最好彻底了解Java类加载语义,否则您将迷失在迷宫中ClassCastException
和LinkageError
的迷宫中。
顺便说一句,通常用于迭代测试插件代码的mvn hpi:run
命令不模拟一个真实的类加载机制。因此,如果您在此空间中使用pluginFirstClassLoader
或任何其他技巧,请始终通过(重新)在示例Jenkins实例中安装*.hpi
来仔细检查生成的类加载行为,例如使用{{ 1}}或/pluginManager/advanced
CLI命令。根据您的描述判断,您已经在做这件事(也许并不知道install-plugin
)。
¹这里的原罪是使用hpi:run
依赖。 optional
应该在json-lib
和json-lib-xom
上定义一个具有硬依赖关系的独特工件json-lib
。这将确保任何给定的类加载器都可以看到xom
和其依赖关系,或者两者都没有。
²JDK-6273389没有进展,唉。标记为重复,但它是重复的,我不确定。从理论上讲,Java 9模块会使这样的问题变得过时 - 通过强加这样繁重的限制,像Jenkins这样的应用程序无法开始使用该模块系统。
答案 1 :(得分:0)
请google&#34; noclassdeffounderror vs 未找到课程&#34; ,此错误表示实际上已找到类依赖项,但在运行时不可用。
尝试以下步骤:
mvn clean package
和mvn clean install
pom.xml
以下是使用运行时依赖性的示例:
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>runtime</scope>
</dependency>
答案 2 :(得分:0)
我的猜测是XOM jar的本地版本与Maven版本中使用的版本不同。要验证使用dependency:list
Maven命令列出所有依赖项。验证列出的XOM依赖项是否与本地jar相同。
答案 3 :(得分:0)
第一次加载此依赖项时,jenkins可能出现错误,现在它被视为已完成。尝试从jenkins&#39;中删除依赖关系。 maven本地存储库并重新运行。这可能会对你有所帮助