使用Jenkins插件的spring-core依赖版本错误

时间:2014-06-05 16:59:49

标签: spring maven jenkins dependencies jenkins-plugins

我试图制作一个使用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-webmvc 3.2.2,它使用的是spring-core 2.5.6?这很奇怪,因为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问题。我将在两个问题中总结一下:

  1. 为什么Maven没有使用正确版本的spring-core编译插件,除非我明确告诉他?它应该能够遵循依赖关系而不给我提示。
  2. 为什么Jenkins使用旧版本的spring-core运行我的插件而不是编译它的插件,我怎样才能使用正确的插件?
  3. 如果您提前提供任何提示,请提前致谢,这可以防止我的任何进展,并且我已经尝试解决这个问题了。

2 个答案:

答案 0 :(得分:2)

尝试"阴影" CF客户端lib使用Maven Shade插件,因为看起来Jenkins doesn't like插件使用的是不同版本的Spring而不是内部使用的插件。

即使你自己的插件没有直接使用Spring,但CF库也没有,我相信这仍然适用。 jenkinsci-dev邮件列表中建议着色的人在Jenkins插件开发中似乎是involved,所以他可能比其他人更了解这一点。

这些说法,我会得到source code for cf-client-lib,我会更改pom.xml以考虑org.springframework包的着色(因为cf-client-lib已经使用着色为org.codehaus.jackson包裹)我会使用这个"阴影" Jenkins插件中的cf-client-lib版本。

答案 1 :(得分:2)

如果你从Jenkins安装而不是从你的插件中获取依赖关系,那么解决方案实际上很容易实现。根据{{​​3}},只需将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>