首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jenkins插件的Spring-core依赖版本错误

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

Stack Overflow用户
提问于 2014-06-05 16:59:48
回答 2查看 2K关注 0票数 3

我正在尝试制作一个使用需要spring 3.2.2的库(cloudfoundry-client-lib)的Jenkins插件。我只需使用mvn命令创建一个框架插件,然后将Maven依赖项添加到pom.xml和一些使用该库的简单代码行中。如果没有我的依赖,我在运行框架插件时不会遇到任何问题。

在用"mvn包“编译时,我得到了一个测试错误:

代码语言:javascript
复制
WARNING: Failed to scout hudson.security.PAMSecurityRealm
java.lang.InstantiationException: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable

看起来这是一个出现在spring 3.1.0中的类。因此,我查看了Maven依赖树:

代码语言:javascript
复制
[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输出就告诉我如下:

代码语言:javascript
复制
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的问题。我将用两个问题来总结整件事:

  1. 为什么Maven不使用正确版本的spring编译插件,除非我明确告诉他这么做?它应该能够跟踪依赖关系,而不需要我给它提示。
  2. 为什么Jenkins运行我的插件时使用的是较旧版本的spring-core,而不是编译的版本,我如何才能使它使用正确的版本?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-03 21:01:12

如果您从Jenkins安装而不是从插件中获取依赖项,那么解决方案实际上很容易实现。按照Jenkins文档,只需将maven-hpi-plugin添加到Jenkins插件的pom.xml中的构建中,并将其设置为首先加载插件类:

代码语言:javascript
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.jenkins-ci.tools</groupId>
            <artifactId>maven-hpi-plugin</artifactId>
            <configuration>
                <pluginFirstClassLoader>true</pluginFirstClassLoader>
            </configuration>
        </plugin>
    </plugins>
</build>
票数 2
EN

Stack Overflow用户

发布于 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的“阴影”版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24066027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档