首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenkins Maven插件: Classloading特性

Jenkins Maven插件: Classloading特性
EN

Stack Overflow用户
提问于 2013-09-11 11:20:37
回答 2查看 601关注 0票数 1

时间很好!

我们的团队使用Maven。其中一个项目模块有一个插件(maven-jibx- plugin ),它需要(对于我们的用例)对专用jar的依赖:

代码语言:javascript
复制
        <plugin>
            <groupId>org.jibx</groupId>
            <artifactId>jibx-maven-plugin</artifactId>
            <version>${jibx.version}</version>
            <executions>
                <execution>
                    <id>main-schemas</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>schema-codegen</goal>
                    </goals>
                    <configuration>
                        <schemaLocation>
                            ...
                        </schemaLocation>
                        <includeSchemas>
                            ...
                        </includeSchemas>
                        <customizations>
                            <customization>${basedir}/src/main/resources/customizations/customization.xml
                            </customization>
                        </customizations>
                        <verbose>true</verbose>
                    </configuration>
                </execution>
                <execution>
                    <id>bind</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>bind</goal>
                    </goals>
                    <configuration>
                        <schemaBindingDirectory>
                            ${basedir}/src/main/resources/bindings
                        </schemaBindingDirectory>
                        <includeSchemaBindings>
                            <includeSchemaBinding>*.xml</includeSchemaBinding>
                        </includeSchemaBindings>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>${project.parent.groupId}</groupId>
                    <artifactId>proprietary-jar</artifactId>
                    <version>${project.parent.version}</version>
                </dependency>
            </dependencies>
        </plugin>

问题是,当我们在本地构建项目时(甚至是在远程机器上的命令行上构建了jenkins ),所有的东西都会成功构建,但是当我们的jenkins实例试图构建它时--构建失败了,出现了这样的消息:"Unable to find class 'class-name-from-the-proprietary-jar'“。在我们添加插件依赖之前,这个问题是局部发生的。

似乎jenkins maven插件中有一些特性不能解决插件依赖关系,也可能是jenkins maven插件类加载的一些众所周知的特性(JiBX用这样的构造加载专有类:SchemaRootBase.class.getClassLoader().loadClass(cname),以便指定插件的依赖关系应该为它提供有关所需类的知识).有人能给我建议解决办法吗?

更新:,原来jenkins实例的JAVA_HOME变量设置为/usr/java/jdk1.7.0_25,但是在我的maven编译器插件中有<target>1.6</target>。问题是否出现在1.7java版本中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-20 15:17:31

我终于找到答案了!问题不在于Jenkins,而在于Maven本身。

注意:正在进行的信息只对Maven 2.进行测试。

结果是,当您有一个多模块项目,并且有几个模块使用相同的插件(具有不同的依赖项)时,Maven将为设置第一个插件的依赖项(我的意思是插件位于第一个模块中,该插件使用该插件构建),并将它们用于其他插件,而不是由本地E 211值覆盖依赖项。

为了澄清这一点,让我们举一个例子。假设在maven构建中有两个模块-A和B:

代码语言:javascript
复制
<modules>
   <module>A</module>
   <module>B</module>
</modules>

模块A在pom文件中有这样的代码:

代码语言:javascript
复制
<plugin>
   <dependencies>
     <dependency>
        <groupId>com.c</groupId>
        <artifactId>D-module</artifactId>
        <version>1</version>
     </dependency>
   </dependencies>
   <groupId>org.jibx</groupId>
   <artifactId>jibx-maven-plugin</artifactId>
   <version>${jibx.version}</version>
</plugin>

模块B在pom文件中有这样的代码:

代码语言:javascript
复制
    <plugin>
       <dependencies>
         <dependency>
            <groupId>com.c</groupId>
            <artifactId>F-module</artifactId>
            <version>1</version>
         </dependency>
       </dependencies>
       <groupId>org.jibx</groupId>
       <artifactId>jibx-maven-plugin</artifactId>
       <version>${jibx.version}</version>
    </plugin>

结果是,当Maven构建模块B时,它将使用D-模块依赖项,即使您已经指定了F-模块依赖项。

在我们的项目中,我们做了这样一个解决方案:我们将插件声明移动到pluginManagement部分中的父pom,并声明了插件的D-模块和F-模块依赖项(还从本地模块中删除了这些依赖项)。好的,代码很难看(父pom文件中有子依赖项),但这是可行的!

如果有人分享了这个问题并设法克服了它,请提出解决方案。

票数 1
EN

Stack Overflow用户

发布于 2013-09-11 11:42:21

在您的工作区中尝试mvn clean install

那么每个地方都应该有相同的错误。也尝试使用Jenkins使用的相同的命令行(如果有的话)

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

https://stackoverflow.com/questions/18739758

复制
相关文章

相似问题

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