如何解决在多模块项目中覆盖配置文件中的属性在 Maven 中无法正常工作
Pom A 是 Pom B 和 Pom C 的父项。
Pom A 有一个配置文件 sample-profile,它覆盖了在 Pom A 中定义的属性
2.11
,sample-profile
中为该属性定义的值为 2.12。
在 Pom A 的依赖管理部分,一个依赖的 artifactId 依赖于
<dependency>
<groupId>com.github.scopt</groupId>
<artifactId>scopt_${scala.version}</artifactId>
<version>3.7.0</version>
</dependency>
项目 C 依赖于 scopt_${scala.version}。项目 B 依赖项目 C。
期望的行为是:
实际行为是:
当我在项目 B 的目录中运行 mvn clean install -DskipTests -Psample-profile
或 mvn dependency:tree -Psample-profile
时,项目 C 的 artifactId 是 scopt_2.11
而不是 scopt_2.12
mvn help:effective-pom -Psample-profile
虽然没有产生 scopt_2.11 的痕迹。
我该如何解决这个问题?
[编辑] - 最初,我使用示例配置文件从 Pom A 构建所有内容(当我这样做时,我具有所需的行为,即具有 scopt_2.12 作为对项目 C)。然后在对项目 B 进行代码修改后,我只需要从 Pom B 构建(使用相同的示例配置文件)。这就是我出现意外行为的时候(即,将 scopt_2.11 作为项目 C 的依赖项)。
解决方法
我不确定真正的原因,但 maven 可能会在解析配置文件之前尝试解析依赖项。特别是因为它们可能会影响插件,而插件可能会扩展 maven(参见 maven extensions)。
你可以试试这个:
- 在您的
dependencyManagement
中声明这两个版本,没有任何配置文件。 - 在子项目 (B) 中,使用
<artifactId>scopt_${scala.version}</artifactId>
作为 artifactId。
这可能有效。
,以下对我有用,为了方便使用 Junit jar。
父 pom 是:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.essexboy</groupId>
<artifactId>parent-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>parent-demo</name>
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
</dependencyManagement>
</profile>
<profile>
<id>profile1</id>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</dependencyManagement>
</profile>
</profiles>
<modules>
<module>mod-b</module>
<module>mod-c</module>
</modules>
</project>
项目 C 看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>parent-demo</artifactId>
<groupId>com.essexboy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>mod-c</artifactId>
<name>mod-a</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
项目 B 看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>parent-demo</artifactId>
<groupId>com.essexboy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>mod-b</artifactId>
<name>mod-a</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.essexboy</groupId>
<artifactId>mod-c</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
greg.clinker@lldevuk-gclinke:~/work/parent-demo/mod-b$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.essexboy:mod-b >-------------------------
[INFO] Building mod-a 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ mod-b ---
[INFO] com.essexboy:mod-b:jar:1.0-SNAPSHOT
[INFO] \- com.essexboy:mod-c:jar:1.0-SNAPSHOT:compile
[INFO] \- junit:junit:jar:4.11:compile
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.774 s
[INFO] Finished at: 2021-05-27T09:47:47+01:00
[INFO] ------------------------------------------------------------------------
greg.clinker@lldevuk-gclinke:~/work/parent-demo/mod-b$ mvn dependency:tree -Pprofile1
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.essexboy:mod-b >-------------------------
[INFO] Building mod-a 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ mod-b ---
[INFO] com.essexboy:mod-b:jar:1.0-SNAPSHOT
[INFO] \- com.essexboy:mod-c:jar:1.0-SNAPSHOT:compile
[INFO] \- junit:junit:jar:4.13.2:compile
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.620 s
[INFO] Finished at: 2021-05-27T09:47:51+01:00
[INFO] ------------------------------------------------------------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。