Jenkins Maven插件:类加载功能

时间:2013-09-11 11:20:38

标签: java maven jenkins jibx

美好时光!

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

        <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加载具有这种结构的专有类:{{1}所以指定插件的依赖关系应该为它提供关于所需类的知识)...有人可以建议解决方法吗?

更新 事实证明,jenkins实例的JAVA_HOME变量设置为SchemaRootBase.class.getClassLoader().loadClass(cname),但在我的maven-compiler-plugin中,我有/usr/java/jdk1.7.0_25。难道问题出现在1.7 java版本中吗?

2 个答案:

答案 0 :(得分:1)

好吧,最后我找到了答案!问题实际上不是在詹金斯,而是在Maven本身。

注意:仅针对Maven 2测试正在传递的信息。

事实证明,当你有一个多模块项目并且有几个模块使用相同的插件不同的依赖项)时,Maven会得到为第一个插件设置的依赖项(我的意思是该插件位于第一个模块中,Maven使用此插件构建)并将其用于其他插件,而不是通过本地覆盖依赖项值。

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

<modules>
   <module>A</module>
   <module>B</module>
</modules>

并且模块A具有 pom 文件中的代码:

<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 文件中有这样的代码:

    <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时,即使您已指定F模块依赖关系,它也将使用D模块依赖关系。

在我们的项目中,我们做了一个变通方法:我们将插件声明移动到 pluginManagement 部分中的父 pom ,并声明了D模块和F模块的依赖关系对于插件(也从本地模块中删除了这些依赖项)。好吧,代码相当丑陋(在父 pom 文件中有子项依赖项),但是这样可行!

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

答案 1 :(得分:0)

在工作区中尝试mvn clean install

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