我有一个问题我想知道是否有人可以帮我解决。 我的项目中有一个模块结构,我使用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。
答案 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>