Jenkins和maven多模块项目缺失工件

时间:2012-01-29 01:31:11

标签: maven maven-2 jenkins multi-module

这是一个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中的问题仍然存在。

它在我的电脑上运行没有问题。

2 个答案:

答案 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的类路径为您解决了问题。