不使用父pom属性的依赖层次结构?

时间:2013-03-27 11:47:21

标签: maven maven-3

我有一个问题我想知道是否有人可以帮我解决。 我的项目中有一个模块结构,我使用Maven解决依赖关系。对于这种结构,我有不同内容的版本我使用分类器区分。对于每个分类器,我在父pom中定义了一个配置文件,其中包含属性中分类器的字符串。这种方式在我的模块中我使用了这个属性,并且是我定义的用于决定分类器常量的配置文件。 我现在遇到的问题是,当依赖关系从我在其中一个模块的pom中定义的依赖继承时,依赖层次结构无法识别分类器。 例如,如果我有项目A,B和C,B取决于A,C取决于B,从C我得到B与分类器但不是A与它。 如果我使用父pom中的属性,就会发生这种情况。如果我直接使用常量字符串,则会正确捕获依赖项。 我看到的唯一解决方案是在每个pom上使用配置文件来定义它们内部的依赖关系。但我有5个档案!有没有其他办法解决这个问题? 我正在使用带有m2e插件的STS 3.8作为我的IDE。

提前谢谢!

我添加了poms

父母:

<profiles>
    <profile>
        <id>TRUNK</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <svnBranch />
        </properties>
    </profile>
    <profile>
        <id>MON</id>
        <properties>
            <svnBranch>MON</svnBranch>
        </properties>
    </profile>
    <profile>
        <id>LOLA</id>
        <properties>
            <svnBranch>LOLA</svnBranch>
        </properties>
    </profile>
    <profile>
        <id>NBA</id>
        <properties>
            <svnBranch>NBA</svnBranch>
        </properties>
    </profile>
    <profile>
        <id>TEST</id>
        <properties>
            <svnBranch>TEST</svnBranch>
        </properties>
    </profile>
    <profile>
        <id>PROD</id>
        <properties>
            <svnBranch>PROD</svnBranch>
        </properties>
    </profile>
</profiles> 

项目A:

<parent>
    <groupId>com.myproject</groupId>
    <artifactId>pom</artifactId>
    <version>1.0.10</version>
</parent>

<artifactId>core-services</artifactId>
<version>1.1.0.41-SNAPSHOT</version>

项目B:

<parent>
    <groupId>com.mycompany</groupId>
    <artifactId>pom</artifactId>
    <version>1.0.10</version>
</parent>

<artifactId>olb-services</artifactId>
<version>1.1.0.41-SNAPSHOT</version>

<properties>
    <module.core-services.dependency.version>1.1.0.41-SNAPSHOT</module.core-services.dependency.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>core-services</artifactId>
        <version>${module.core-services.dependency.version}</version>
        <classifier>${svnBranch}</classifier>
    </dependency>
</dependencies>

项目C:

<parent>
    <groupId>com.mycompany</groupId>
    <artifactId>pom</artifactId>
    <version>1.0.10</version>
</parent>

<artifactId>nba-services</artifactId>
<version>1.1.0.41-SNAPSHOT</version>

<properties>
    <module.olb-services.dependency.version>1.1.0.41-SNAPSHOT</module.olb-services.dependency.version>
    <module.core-services.dependency.version>1.1.0.41-SNAPSHOT</module.core-services.dependency.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>olb-services</artifactId>
        <version>${module.olb-services.dependency.version}</version>
        <classifier>${svnBranch}</classifier>
    </dependency>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>core-services</artifactId>
        <version>${module.core-services.dependency.version}</version>
        <classifier>${svnBranch}</classifier>
    </dependency>
</dependencies>

在每个依赖项的分类器标记中使用$ {svnBranch}不起作用。它看起来像在项目B中,当项目C引用时,属性$ {svnBranch}是空的,但它来自父pom。

1 个答案:

答案 0 :(得分:2)

在maven中,只能使用在子pom中父级别定义的配置文件,如果只能通过传递-D {activation.property} = value或-P {profile.id/来在构建时激活它。 s}。

您无法在父级中定义配置文件并尝试在您的子pom中激活该配置文件,因为无法继承配置文件(根据您的示例,您甚至不会尝试在您的案例中激活子pom)。

换句话说,除非默认情况下激活配置文件,否则maven不知道它(在您的情况下,您可能会默认激活所有内容,但请记住,当时默认情况下只能激活一个配置文件)

你的问题是来自TRUNK的$ {svnBranch}只存在于你的孩子pom中并且没有值,因此maven只作用于GAV而不是分类器。并证明检查你孩子的有效pom(mvn help:effective-pom)。您还可以检查哪些配置文件处于活动状态,哪些配置文件不活动(mvn help:all-profiles)。

我不认为使用配置文件是您正在做的最佳方法。例如,更好/更简单的方法可能是在父级的普通属性中声明分支名称。

<properties>
 <svnBranch.lola>LOLA</svnBranch.lola>
 <svnBranch.nba>NBA</svnBranch.nba>
</properties>

然后您的孩子根据需要使用。

<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>olb-services</artifactId>
        <version>${module.olb-services.dependency.version}</version>
        <classifier>${svnBranch.lola}</classifier>
    </dependency>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>core-services</artifactId>
        <version>${module.core-services.dependency.version}</version>
        <classifier>${svnBranch.nba}</classifier>
    </dependency>
</dependencies>