使用Maven 2构建子项目时丢失工件

时间:2010-09-03 23:45:05

标签: inheritance maven-2 aggregation

我有一个父项目,其中包含5个孩子,彼此之间也存在依赖关系。我在子项pom.xml中使用了<parent>元素的继承,在父项中使用了<module>元素的聚合。

我的父母pom看起来像这样:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.domain</groupId>
<artifactId>Parent</artifactId>
<packaging>pom</packaging>
<version>RELEASE</version>
<name>Parent</name>

<modules>
    <module>../Child1</module>
    <module>../Child2</module>
    <module>../Child3</module>
    <module>../Child4</module>
    <module>../Child5</module>
</modules>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.domain</groupId>
            <artifactId>Child1</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.domain</groupId>
            <artifactId>Child2</artifactId>
            <version>RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>
</project>

Child3 pom看起来像这样:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.domain</groupId>
<artifactId>Child3</artifactId>
<name>Child3</name>
<packaging>war</packaging>

<parent>
    <artifactId>Parent</artifactId>
    <groupId>com.domain</groupId>
    <version>RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>com.domain</groupId>
        <artifactId>Child1</artifactId>
    </dependency>
    <dependency>
        <groupId>com.domain</groupId>
        <artifactId>Child2</artifactId>
    </dependency>
</dependencies>
</project>

当我在Parent或Child1上运行mvn install时,一切正常。但是当我在Child3上运行它时,我得到以下错误:

[INFO] Failed to resolve artifact.
Missing:
----------
1) com.domain:Child1:jar:RELEASE
...
2) com.domain:Child2:jar:RELEASE

我的设置有什么问题?

1 个答案:

答案 0 :(得分:6)

我不会真正尝试解决您当前的方法问题,而是会覆盖我认为是这种情况下的最佳做法。随意采用或不采用:)

首先,请注意RELEASE(和LATEST)是一个特殊的关键字(不确定您是否知道这一点)并且RELEASE在某种程度上被滥用(父母一方)使用定义为RELEASE的版本并没有多大意义。无论如何,这些特殊关键字是一个坏主意,并且为了构建可重复性而被弃用(我不确定它们是否在Maven3中得到支持),只是避免使用它们。

因此,如果项目处于活动开发状态,请使用SNAPSHOT版本,即修改父项,如下所示:

<project>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.domain</groupId>
  <artifactId>Parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Parent</name>

  <modules>
    <module>../Child1</module>
    <module>../Child2</module>
    <module>../Child3</module>
    <module>../Child4</module>
    <module>../Child5</module>
  </modules>

</project>

请注意,我删除了dependencyManagement元素,我认为它不会为多模块构建的内部依赖项提供更多附加值,并建议使用${project.groupId}而是在声明它们时使用${project.version}内置属性:

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <artifactId>Parent</artifactId>
    <groupId>com.domain</groupId>
    <version>1.0-SNAPSHOT</version><!-- must hard code this -->
  </parent>

  <!--groupId>com.domain</groupId--><!-- you can skip this, you inherit it -->
  <artifactId>Child3</artifactId>
  <packaging>war</packaging>

  <name>Child3</name>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>Child1</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>Child2</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>

正如我所写,我不认为使用dependencyManagement内部依赖项非常有用,这就是我设置项目的方式。但如果你愿意,你可以。只需使用属性不重复信息。