1

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

先感谢您!

我添加了 poms

父pom:

<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> 

项目一:

<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。

4

1 回答 1

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>
于 2013-03-28T11:31:20.577 回答