美好时光!
我们的团队使用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版本中吗?
答案 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使用的相同命令行(如果有的话)