时间很好!
我们的团队使用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编译器插件中有<target>1.6</target>。问题是否出现在1.7java版本中?
发布于 2013-09-20 15:17:31
我终于找到答案了!问题不在于Jenkins,而在于Maven本身。
注意:正在进行的信息只对Maven 2.进行测试。
结果是,当您有一个多模块项目,并且有几个模块使用相同的插件(具有不同的依赖项)时,Maven将为设置第一个插件的依赖项(我的意思是插件位于第一个模块中,该插件使用该插件构建),并将它们用于其他插件,而不是由本地E 211值覆盖依赖项。
为了澄清这一点,让我们举一个例子。假设在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时,它将使用D-模块依赖项,即使您已经指定了F-模块依赖项。
在我们的项目中,我们做了这样一个解决方案:我们将插件声明移动到pluginManagement部分中的父pom,并声明了插件的D-模块和F-模块依赖项(还从本地模块中删除了这些依赖项)。好的,代码很难看(父pom文件中有子依赖项),但这是可行的!
如果有人分享了这个问题并设法克服了它,请提出解决方案。
发布于 2013-09-11 11:42:21
在您的工作区中尝试mvn clean install
那么每个地方都应该有相同的错误。也尝试使用Jenkins使用的相同的命令行(如果有的话)
https://stackoverflow.com/questions/18739758
复制相似问题