这是一个ear项目的简化示例,父pom聚合了EAR,EJB和jar。
我在Maven项目中有这个结构,存储在SVN中:
parent/
|- pom.xml
|- modulA/
| |- pom.xml
|- modulB/
| |- pom.xml
modulB具有modulA的依赖性
pom.xml有模块部分
<modules>
<module>modulA</module>
<module>modulB</module>
</modules>
依赖管理部分
<dependencyManagement>
<dependencies>
<dependency>
<groupId>group</groupId>
<artifactId>modulA</artifactId>
<version>0.0.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>group</groupId>
<artifactId>modulB</artifactId>
<version>0.0.2-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块引用父
<parent>
<groupId>group</groupId>
<artifactId>parent</artifactId>
<version>0.0.2-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
当我第一次使用maven 2.2.1(windows)编译时,在我的电脑中
mvn clean compile
我没有任何问题
但....当Jenkins第一次尝试编译时(Maven 2.2.1 Linux RedHat)
Missing:
----------
1) modulA:jar:0.0.2-SNAPSHOT
Try downloading the file manually from the project website.
Then, install it using the command:
mvn install:install-file -DgroupId=group -DartifactId=modulA -Dversion=0.0.2- SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file
Alternatively, if you host your own repository you can deploy the file there:
mvn deploy:deploy-file -DgroupId=group -DartifactId=modulA -Dversion=0.0.2-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
Path to dependency:
1) modulB:ejb:0.0.2-SNAPSHOT
2) modulA:jar:0.0.2-SNAPSHOT
----------
1 required artifacts are missing.
为什么????????
之后如果我将项目从我的电脑部署到Artifactory,Jenkins没有问题,因为Jenkins从存储库中下载工件......但为什么Jenkins依赖于存储库中的工件?
:(
先谢谢
修改
我认为dependencyManagement部分只“定义”依赖项,但如果子模块不使用依赖项,则不会将依赖项添加到子模块中。 我放弃了dependencyManagement部分,Jenkins中的问题仍然存在。
它在我的电脑上运行没有问题。
答案 0 :(得分:0)
我希望上面的依赖关系管理部分在父pom中。根据您的要求,modulB具有模数的依赖性。所以我建议你在moduleB中包含依赖,而不是在父pom中。我认为当它第一次运行时,maven正在寻找两个依赖关系,因为你在父pom中提到过。看看你的项目构建顺序。首先,它构建模块A,然后构建B.在您的情况下,我希望您在moduleA的pom文件中包含所有其他依赖项,一旦构建它将部署jar文件到m2存储库。然后moduleB开始构建,因为你的依赖已经在m2存储库中,它不会喊出来,项目将成功构建。
答案 1 :(得分:0)
第一次构建父项目时,Jenkins用户的maven存储库将不会安装modulA。然后,clean compile
在modulA中成功运行,但未安装任何内容。当它以modulB运行时,无法解析对modulA的依赖。
如果你的Jenkins工作目标是clean install
而不是clean compile
,那么modulA的工件将在modulB构建开始之前安装到Jenkins用户的存储库中,并且一切都可以工作。
据推测,这可以在您自己的计算机上运行,因为您在modulA中至少运行过一次mvn install
,或者因为您的IDE的类路径为您解决了问题。