gpt4 book ai didi

java - Jenkins Maven 插件 : Classloading Feature

转载 作者:太空宇宙 更新时间:2023-11-04 07:24:37 26 4
gpt4 key购买 nike

好时光!

我们的团队使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com