簡體   English   中英

在 Maven 中,多模塊項目中的配置文件中的覆蓋屬性無法正常工作

[英]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-profilemvn 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中聲明這兩個版本,沒有任何配置文件惡作劇。
  • 在子項目 (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] ------------------------------------------------------------------------

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM