[英]Overriding properties in profile in multi module projects is not working properly in Maven
Pom A 是 Pom B 和 Pom C 的父級。
Pom A 有一個配置文件 sample-profile,它覆蓋了 Pom A 中定義的屬性 <scala.version>。
<scala.version> 的默認值為2.11
,在sample-profile
中為此屬性定義的值為 2.12。
在 Pom A 的 dependencyManagement 部分中,一個依賴項的 artifactId 取決於 <scala.version> 的值。
<dependency>
<groupId>com.github.scopt</groupId>
<artifactId>scopt_${scala.version}</artifactId>
<version>3.7.0</version>
</dependency>
項目 C 取決於 scopt_${scala.version}。 項目 B 依賴於項目 C。
期望的行為是:
mvn clean install -DskipTests -Psample-profile
並獲取項目 C 取決於 scopt_2.12。實際行為是:
當我在項目 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 擴展)。
你可以試試這個:
dependencyManagement
中聲明這兩個版本,沒有任何配置文件惡作劇。<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] ------------------------------------------------------------------------
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.