【发布时间】:2014-07-26 18:59:06
【问题描述】:
我正在尝试制作一个使用 a library that requires spring-core 3.2.2 (cloudfoundry-client-lib) 的 Jenkins 插件。我只是使用 mvn 命令创建了一个骨架插件,然后将我的 Maven 依赖项添加到 pom.xml 和一些使用该库的简单代码行。没有我的依赖,我运行骨架插件没有任何问题。
使用“mvn package”编译时,出现测试错误:
WARNING: Failed to scout hudson.security.PAMSecurityRealm
java.lang.InstantiationException: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable
看起来这是一个出现在 spring-core 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-core 2.5.6 是因为 spring-webmvc 3.2.2?这很奇怪,因为looking online, spring-webmvc 3.2.2 depends on spring-core 3.2.2。查看详细版本的树,looks like jenkins-core depends on spring-core 2.5.6... 这让我怀疑问题出在 Jenkins。
无论如何,如果只是版本冲突,那么通过在我的 pom.xml 中明确说我想要 spring-core 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-core 3.1 中添加的一种方法,因此这意味着 Jenkins 仍在尝试使用旧版本的 spring-core 运行我的插件,即使我明确表示我想要最新的插件插件的 pom.xml!
所以我坚持这一点。我什至不确定这是 Maven 还是 Jenkins 问题。我会用两个问题来总结整个事情:
- 为什么 Maven 不使用正确版本的 spring-core 编译插件,除非我明确告诉他这样做?它应该能够在没有我提示的情况下遵循依赖关系。
- 为什么 Jenkins 运行我的插件时使用的 spring-core 版本比编译时使用的版本旧,我怎样才能让它使用正确的版本?
【问题讨论】:
-
你能发布完整的 pom.xml 吗?
-
这里是:pastebin.com/UGS2uRfA。感谢您的宝贵时间!
-
It seems 这不是一件容易的事。在该讨论中,插件中的代码使用
org.springframework包,而在您的代码使用的库的情况下,它使用org.springframework包。但是这个建议本身有点说,不可能在你的插件中简单地使用另一个版本的 Spring,这与 Jenkins 使用的不同。您是否有机会构建自己的使用 Maven Shade 插件的cloudfoundry-client-libjar 版本? -
你能分享你的插件的完整代码吗?我尝试了
cloudfoundry-client-lib的“阴影”版本,但我之前没有使用过 Jenkins,也没有为它开发过插件,所以我无法实际测试它是否有效。 -
Here is the entire source code. 你找到的那个链接很有趣,我想我也会自己研究一下。
标签: spring maven jenkins dependencies jenkins-plugins