1

美好时光!

我们的团队使用 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 版本的问题?

4

2 回答 2

1

嗯,终于找到答案了!问题实际上不在于 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-module 依赖项,它也会使用 D-module 依赖项。

在我们的项目中,我们做了这样的解决方法:我们将插件声明移到了pluginManagement部分的父pom中,并声明了插件的 D-module 和 F-module 依赖项(也从本地模块中删除了这些依赖项)。好的,代码相当难看(在父pom文件中有子依赖项),但这有效!

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

于 2013-09-20T15:17:31.817 回答
0

mvn clean install在您的工作区尝试

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

于 2013-09-11T11:42:21.223 回答