Maven多模块依赖问题

时间:2019-02-20 10:32:14

标签: java maven

我有一个主要项目pom的问题。这指定了应用程序的两个主要模块。这个主要pom包含一些常见的依赖项定义:

父母:

<groupId>com.maven.showcase</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<modules>
    <module>main.module.1</module>
    <module>main.module.2</module>
</modules>

<properties>
    <main.module.1.version>1.1.1-SNAPSHOT</main.module.1.version>
    <main.module.2.version>2.2.2-SNAPSHOT</main.module.2.version>
</properties>

此处定义了两个主要模块的版本。每个主模块的版本以及该模块中所有子模块的版本都相同。我拥有$ {revision}属性来实现此目的。

主pom 1:

<parent>
    <artifactId>parent</artifactId>
    <groupId>com.maven.showcase</groupId>
    <version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>main.module.1</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>

<properties>
    <revision>${main.module.1.version}</revision>
</properties>

<modules>
    <module>sub.module.1</module>
</modules>

主pom 2:

<parent>
    <artifactId>parent</artifactId>
    <groupId>com.maven.showcase</groupId>
    <version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>main.module.2</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>

<properties>
    <revision>${main.module.2.version}</revision>
</properties>

<modules>
    <module>sub.module.2</module>
</modules>

每个模块都包含一个子模块。

子模块1:

<parent>
    <artifactId>main.module.1</artifactId>
    <groupId>com.maven.showcase</groupId>
    <version>${revision}</version>
</parent>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>

<artifactId>sub.module.1</artifactId>

子模块2:

<parent>
    <artifactId>main.module.2</artifactId>
    <groupId>com.maven.showcase</groupId>
    <version>${revision}</version>
</parent>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>

<artifactId>sub.module.2</artifactId>

<dependencies>
    <dependency>
        <artifactId>sub.module.1</artifactId>
        <groupId>com.maven.showcase</groupId>
        <version>${main.module.1.version}</version>
    </dependency>
</dependencies>

如您所见,子模块2引用子模块1作为依赖项。是主pom中定义的那个。当我构建整个项目时,此方法效果很好。但是,当我尝试构建子模块2时出现问题:

  

[错误]无法在项目sub.module.2上执行目标:无法   解决项目的依赖关系   com.maven.showcase:sub.module.2:jar:2.2.2-SNAPSHOT:无法收集   com.maven.showcase:sub.module.1:jar:1.1.1-SNAPSHOT上的依赖项:   无法读取工件描述符   com.maven.showcase:sub.module.1:jar:1.1.1-SNAPSHOT:找不到   中央的工件com.maven.showcase:main.module.1:pom:$ {revision}   (https://repo.maven.apache.org/maven2)-> [帮助1]

我完全可以理解为什么会发生这种情况,因为当我仅构建子模块2时,就不会真正解析主模块的pom,因此maven不知道该用什么来代替“修订”。

问题是:是否有更好的方法来解决此问题?我无法使用全局属性,因为如果我尝试使用在父pom中定义的属性,就会不断收到“在父pom定义中禁止使用属性”。 (Maven 3.5.3)

出于各种原因,例如,为了获得Maven依赖树,我需要能够构建单独的子模块。

谢谢, 朋友

1 个答案:

答案 0 :(得分:1)

请勿将占位符用于版本号!该版本是Maven的关键,不应抽象化。

请检查“ mvn版本:设置”插件。如果您必须更改版本号,它将为您提供帮助。它将在所有必要的地方自动更改它。您不应该再对此感到占位符了。 ;)