我正在尝试制作一个Jenkins插件,该插件使用需要spring-core 3.2.2(cloudfoundry-client- lib)的库。我只是使用mvn命令创建一个骨架插件,然后将我的Maven依赖项添加到pom.xml和一些使用该库的简单代码行。在没有我的依赖的情况下,运行骨架插件没有任何问题。
使用“ mvn软件包”进行编译时,出现测试错误:
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?这很奇怪,因为在网上看,spring- webmvc 3.2.2依赖于spring-core 3.2.2。看着树的详细版本,看起来jenkins-core依赖于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;
unmodifiableableMultiValueMap()是spring-core 3.1中添加的一种方法,因此这意味着Jenkins仍在尝试使用旧版本的spring-core运行我的插件,即使我明确地说我想要插件pom中的最新插件。 xml!
所以我坚持了这一点。我什至不确定这是Maven还是Jenkins问题。我将用两个问题来总结整个问题:
在此先感谢您提供的任何提示,这阻碍了我的进度,并且我已经尝试解决了一段时间。
如果您是从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>