java - Jenkins Maven 插件 : Classloading Feature

标签 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 使用这样的构造加载专有类: SchemaRootBase.class.getClassLoader().loadClass(cname) 因此,指定插件的依赖项应该提供有关所需类的知识)...有人可以建议解决方法吗?

更新: 原来jenkins实例的JAVA_HOME变量设置为/usr/java/jdk1.7.0_25 ,但在我的 maven-compiler-plugin 中我有 <target>1.6</target> 。难道问题出在1.7 java版本上?

最佳答案

好吧,我终于找到答案了!问题实际上不在于 Jenkins,而在于 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 文件中具有子依赖项),但这可行!

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

关于java - Jenkins Maven 插件 : Classloading Feature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18739758/

相关文章:

java.lang.ClassNotFoundException : org. json.JSONObject

java - 配置 Jacoco 进行集成测试代码覆盖率

jenkins - 如何在 jenkins 管道脚本中使用 helm 命令

Jenkins 提升构建参数值

maven - SonarQube "The main branch has no lines of code."问题,而 Jenkins 说分析成功

java - 是否可以捕获除运行时异常之外的所有异常?

Javafx 实时线程更新

java - Apache 公地 : Weird results from ChiSquareTest

java - 如何从 api url 获取本地货币代码?

java - Jackson 不会将新的 JSON 对象附加到现有的 Json 文件中