我正在尝试制作一个使用需要spring 3.2.2的库(cloudfoundry-client-lib)的Jenkins插件。我只需使用mvn命令创建一个框架插件,然后将Maven依赖项添加到pom.xml和一些使用该库的简单代码行中。如果没有我的依赖,我在运行框架插件时不会遇到任何问题。
在用"mvn包“编译时,我得到了一个测试错误:
WARNING: Failed to scout hudson.security.PAMSecurityRealm
java.lang.InstantiationException: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable看起来这是一个出现在spring 3.1.0中的类。因此,我查看了Maven依赖树:
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ stackato-jenkins ---
[INFO] org.wiwiweb:cf-test-jenkins:hpi:1.0-SNAPSHOT
[INFO] \- org.cloudfoundry:cloudfoundry-client-lib:jar:1.0.2:compile
[INFO] \- org.springframework:spring-webmvc:jar:3.2.2.RELEASE:compile
[INFO] \- org.springframework:spring-core:jar:2.5.6.SEC03:compile所以Maven告诉我,它使用spring 2.5.6是因为Spring-webmvc3.2.2?这很奇怪因为在线观察,3.2.2取决于spring 3.2.2。。看着这棵树的详细版本,看起来jenkins-core依赖spring-core 2.5.6.这让我怀疑问题出在詹金斯身上。
无论如何,如果这只是一个版本冲突,那么通过明确表示我希望在我的pom.xml中使用spring 3.2.2来推翻Maven的决定,应该可以解决这个问题,对吗?我这样做了,然后没有得到编译错误。问题解决了!不。
在运行时,激活Jenkins中的这个插件并使用它运行构建之后,一旦代码运行到使用我添加的库的行中,Jenkins输出就告诉我如下:
FATAL: org.springframework.util.CollectionUtils.unmodifiableMultiValueMap(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/util/MultiValueMap;
java.lang.NoSuchMethodError: org.springframework.util.CollectionUtils.unmodifiableMultiValueMap(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/util/MultiValueMap;UnmodifiableMultiValueMap()是在spring 3.1中添加的一种方法,因此这意味着Jenkins仍在尝试使用spring的旧版本运行我的插件,尽管我明确表示我想在插件的pom.xml中使用最新的插件!
所以我被困在这上面了。我甚至不确定是Maven还是Jenkins的问题。我将用两个问题来总结整件事:
发布于 2015-04-03 21:01:12
如果您从Jenkins安装而不是从插件中获取依赖项,那么解决方案实际上很容易实现。按照Jenkins文档,只需将maven-hpi-plugin添加到Jenkins插件的pom.xml中的构建中,并将其设置为首先加载插件类:
<build>
<plugins>
<plugin>
<groupId>org.jenkins-ci.tools</groupId>
<artifactId>maven-hpi-plugin</artifactId>
<configuration>
<pluginFirstClassLoader>true</pluginFirstClassLoader>
</configuration>
</plugin>
</plugins>
</build>发布于 2014-06-15 10:57:02
尝试使用Maven Shade插件“隐藏”CF客户端库,因为似乎詹金斯不喜欢插件使用的版本与其内部使用的版本不同。
即使您自己的插件不直接使用Spring,但CF库使用,我相信这仍然适用。建议在jenkinsci-dev邮件列表中添加阴影的人似乎是Jenkins插件开发中的所涉及的,因此他可能比其他人更了解这一点。
话虽如此,我将获得cf-client-lib的源代码,我将更改pom.xml以考虑对org.springframework包进行阴影处理(因为client lib已经为org.codehaus.jackson包使用了阴影),我将在Jenkins插件中使用这个client的“阴影”版本。
https://stackoverflow.com/questions/24066027
复制相似问题