Java 为什么我的pom.xml依赖项不是';找不到我的詹金斯插件?
MyJava 为什么我的pom.xml依赖项不是';找不到我的詹金斯插件?,java,maven,jenkins,Java,Maven,Jenkins,Mypom.xml具有以下依赖关系: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <
pom.xml
具有以下依赖关系:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>runtime</scope>
</dependency>
net.sf.json-lib
自述文件有精确的复制步骤
所选答案的注释
我的样本回购的公关让我走到了我需要去的地方。我确实有一些其他问题需要解决,但JSONObject冲突是核心问题。按照杰西的公关建议,我把所有的全球配置都去掉了。另一个可能会让未来的浏览者担心的问题是,当使用xom
作为显式依赖项时,同时对org.jenkins ci.plugins
使用高于1.626的版本。请谷歌“noclassdeffounderrorvs未找到类”,此错误意味着实际上找到了类依赖项,但在运行时不可用
尝试以下步骤:
- 运行
mvn清洁软件包
和mvn清洁安装
- 检查您的maven环境是否正确,是否有最新的JAR
- 检查已安装的目标项目是否包含所需的JAR
- 检查是否将依赖项类型选择为运行时,而不是仅选择为
在
pom.xml中编译时
以下是使用运行时依赖关系的示例:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>runtime</scope>
</dependency>
a组
伪影-b
1
酒吧
运行时
Jenkins核心包json库
。(一个分叉副本,对于这个问题来说并不重要。)它不捆绑可选的依赖项imk XOM,不管是什么。当您的插件加载XmlSerializer.class
时,它由Jenkins core的类加载程序定义,然后该类加载程序尝试链接到类,如nu.xom.Node
。由于这在XmlSerializer
的定义加载器(Jenkins核心类加载器)(或多或少地Jenkins.war!/WEB-INF/lib/*.jar
)中不可用,因此会出现错误。在插件类加载器中可以访问该名称的类这一事实是没有意义的,请原谅这个双关语
如果您的插件需要使用自己的类版本,这些类通常捆绑在Jenkins core中,并隐式地公开给插件,那么它不仅需要捆绑这些JAR(一个常规的编译范围的Maven依赖就足够了),还需要使用。在尝试这样做之前,您最好彻底理解Java类加载语义,否则您将迷失在一个神秘的²ClassCastException
s和LinkageError
s迷宫中
顺便说一句,通常用于迭代测试插件代码的mvnhpi:run
命令并不模拟实际的类加载机制。因此,如果您正在使用pluginFirstClassLoader
或此空间中的任何其他技巧,请始终通过在示例Jenkins实例中(重新)安装*.hpi
,例如使用/pluginManager/advanced
,或install plugin
CLI命令,仔细检查生成的类加载行为。根据您的描述判断,您已经在这样做了(并且可能不知道hpi:run
)
这里的原罪是使用可选的依赖项json-lib
应该定义一个不同的工件json-lib-xom
,它对json-lib
和xom
具有硬依赖性。这将确保任何给定的类装入器都可以看到XmlSerializer
及其依赖项,或者两者都看不到
唉,这方面没有进展。标记为复制品,但我不确定它是什么的复制品。从理论上讲,Java 9模块通过施加像Jenkins这样的应用程序无法使用该模块系统的繁重限制,使类似这样的问题变得过时。我猜XOM jar的本地版本与Maven版本中使用的版本不一样。要验证,请使用dependency:list
Maven命令列出所有依赖项。验证所列出的XOM依赖项是否与本地jar的版本相同。当第一次加载此依赖项时,jenkins上可能发生错误,现在认为它已完成。尝试从jenkins的maven本地存储库中删除依赖项并重新运行。这可能会对你有所帮助你在建优步罐吗?您需要使用assembly或shade插件将依赖项添加到jar文件。@puhlen这些插件是用于java还是用于Jenkins的上下文?我认为Maven应该自己管理依赖关系,那么为什么需要插件呢?这些都是Maven插件。在maven中,一切都是由插件完成的,插件将您的依赖项打包到jar中。Maven确实为您处理了这个问题,但是您需要告诉它您想要(通过添加和配置插件)@puhlen在Jenkins的上下文中,我必须上传一个hpi。正如您所说,这些插件是关于向JAR中添加更多内容的。但是Jenkins没有使用我的JAR,我不熟悉.hpi文件。看起来像jenkins插件文件?构建胖罐子不需要jeninks插件。你不使用jar是什么意思?啊,让我试试pom.xml
中的作用域runtime
。可能就是这样。我看到你更新了你的答案。默认值是编译。在你的帖子之后,我刚刚读到了这篇文章:)切换到运行时会将错误更改为java.lang.ClassNotFoundException:nu.xom.Node
你能检查一下安装的目标并查看它是否包含jar(步骤4),你能显示日志和分解的目标war文件吗?还是子文件夹?在本地,我看到了我的项目的jar,但没有看到依赖项jar。但我并没有看到其他依赖项的jar文件,这些依赖项工作得很好。在Jenkins中,我看到目标文件夹下根本没有JAR。当我在Jenkins中调用一个目标时,我会执行clean clover:setup test clover:aggregate clover:clover
注意这是一个