2014-10-28 52 views
1

假設我有一個多模塊maven項目。其中一個項目的POM文件如下:帶插件的Maven配置文件行爲

<?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> 
    <groupId>some.group</groupId> 
    <artifactId>parent-artifact</artifactId> 
    <version>0.14.0-SNAPSHOT</version> 
    <relativePath>../../pom.xml</relativePath> 
    </parent> 

    <artifactId>artifact-x</artifactId> 
    <packaging>jar</packaging> 
    <name>Artifact X</name> 

    <dependencies> 
    <dependency> 
     <groupId>some.group</groupId> 
     <artifactId>artifact-a</artifactId> 
     <version>${project.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>some.group</groupId> 
     <artifactId>artifact-b</artifactId> 
     <version>${project.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>some.group</groupId> 
     <artifactId>artifact-c</artifactId> 
     <version>${project.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>some.group</groupId> 
     <artifactId>artifact-d</artifactId> 
     <version>${project.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>some.group</groupId> 
     <artifactId>artifact-e</artifactId> 
     <version>${project.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    </dependencies> 

</project> 

比方說,出於某種原因,我想移動一些依賴於這個POM文件到一個配置文件。因此,在使用profile-1時,我將artifact-cartifact-d,artifact-e僅視爲相關性。 profile-1也用於該項目中的其他POM。我的新POM現在變成:

<?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> 
    <groupId>some.group</groupId> 
    <artifactId>parent-artifact</artifactId> 
    <version>0.14.0-SNAPSHOT</version> 
    <relativePath>../../pom.xml</relativePath> 
    </parent> 

    <artifactId>artifact-x</artifactId> 
    <packaging>jar</packaging> 
    <name>Artifact X</name> 

    <dependencies> 
    <dependency> 
     <groupId>some.group</groupId> 
     <artifactId>artifact-a</artifactId> 
     <version>${project.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>some.group</groupId> 
     <artifactId>artifact-b</artifactId> 
     <version>${project.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    </dependencies> 

    <profiles> 
    <profile> 
     <id>profile-1</id> 
     <dependencies> 
     <dependency> 
      <groupId>some.group</groupId> 
      <artifactId>artifact-c</artifactId> 
      <version>${project.version}</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>some.group</groupId> 
      <artifactId>artifact-d</artifactId> 
      <version>${project.version}</version> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>some.group</groupId> 
      <artifactId>artifact-e</artifactId> 
      <version>${project.version}</version> 
      <scope>runtime</scope> 
     </dependency> 
     </dependencies> 
    </profile> 
    </profiles> 

</project> 

建設的時候,我在兩種情況下,頂層POM運行mvn -Pprofile-1 clean package。我的期望是,當指定-Pprofile-1時,將依賴關係移至配置文件不應改變任何內容。但是這並沒有發生 - 一些插件開始出現錯誤 - 例如。該maven-shade-plugin沒有把artifact-cartifact-dartifact-e在陰影罐子等

我是不是做錯了什麼?配置文件不應該這樣工作?

即使與-Pprofile-1一起使用,這兩個POM文件是不是等效的?

回答

1

即使pom.xml允許你這樣定義它,你不應該(稱之爲設計缺陷)。大多數情況下,僅僅在配置文件中添加依賴關係是沒有意義的。有效的構造是基於OS或JDK版本的依賴項。 另外請記住,pom.xml也充當「consumer-pom」,所以使用此工件的其他項目將讀取此pom文件以獲取傳遞依賴關係。在這種情況下,您無法再激活配置文件。

總之:不要試圖用配置文件來解決這個問題。必須有更好的解決方案。

+0

嘿羅伯特, 感謝您的答覆。 所以,多一點信息:我沒有這樣做的自由 - 我試圖修改已經使用配置文件進行依賴關係的Apache Hive(Hadoop-1和Hadoop-2的不同依賴關係)這就是爲什麼我認爲這兩個POM在使用profile-1時應該是等效的。情況並非如此嗎? – 2014-10-28 20:35:05

+0

我只知道Hive和Hadoop的名稱,但我會說:結果是2個不同的應用程序,它們有自己的groupId/artifactId/version,所以有2個不同的poms。即使在引入分類器時,您也無法在配置文件之間做出區別,但它們仍然使用相同的「pom.xml」 – 2014-10-28 21:10:30