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

时间:2017-09-01 15:35:59

标签: java maven jenkins

我的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。

4 个答案:

答案 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类加载语义,否则您将迷失在迷宫中ClassCastExceptionLinkageError的迷宫中。

顺便说一句,通常用于迭代测试插件代码的mvn hpi:run命令模拟一个真实的类加载机制。因此,如果您在此空间中使用pluginFirstClassLoader或任何其他技巧,请始终通过(重新)在示例Jenkins实例中安装*.hpi来仔细检查生成的类加载行为,例如使用{{ 1}}或/pluginManager/advanced CLI命令。根据您的描述判断,您已经在做这件事(也许并不知道install-plugin)。

¹这里的原罪是使用hpi:run依赖。 optional应该在json-libjson-lib-xom上定义一个具有硬依赖关系的独特工件json-lib。这将确保任何给定的类加载器都可以看到xom 其依赖关系,或者两者都没有。

²JDK-6273389没有进展,唉。标记为重复,但它是重复的,我不确定。从理论上讲,Java 9模块会使这样的问题变得过时 - 通过强加这样繁重的限制,像Jenkins这样的应用程序无法开始使用该模块系统。

答案 1 :(得分:0)

请google&#34; noclassdeffounderror vs 未找到课程&#34; ,此错误表示实际上已找到类依赖项,但在运行时不可用。

尝试以下步骤:

  • 运行mvn clean packagemvn clean install
  • 检查您的maven环境是否正确且有最新的罐子
  • 检查已安装的目标项目是否包含所需的jar
  • 检查依赖关系类型是否被选为运行时而不仅仅是 在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本地存储库并重新运行。这可能会对你有所帮助