2010-08-20 123 views
7

假設我有一個模塊A:jar,其運行時和編譯依賴關係取決於JDK版本。在我的例子中,我有一個pre-jdk6-profileJAXB API:在JDK 1.6.0之前,我需要包含jaxb-api-nnn.jar作爲編譯依賴。此配置文件被放置到A.pom。我也有模組B:war,這取決於A:jar。我希望能夠在構建服務器上激活此配置文件以構建JDK 1.5.x可交付成果。當我被激活給定的配置文件執行的Maven,我得到的消息:如何激活依賴模塊中的Maven配置文件?

mvn -Ppre-jdk6-profile -o install 
[WARNING] 
     Profile with id: 'pre-jdk6-profile' has not been activated. 

jaxb-api-nnn.jar,導致B.war丟失。但是,如果我從父母pom.xml構建時激活此配置文件,則一切正常。這意味着配置文件不會從依賴關係繼承,並且父多模塊pom.xml能夠正確構建所有內容,因爲它似乎將所有配置文件合併到了reactor中。

將配置文件移動到父pom會使事情變得更糟,因爲依賴項適用於所有其他項目(例如C:ear)。這個任務是否有很好的解決方案,也就是說,如果任何模塊A依賴於模塊B,那麼正確處理由配置文件激活的所有編譯和運行時相關性?

的輪廓在項目A:jar如下:

<project ...> 
    <artifactId>A</artifactId> 
    <packaging>jar</packaging> 
    ... 
    <parent> 
     <artifactId>P</artifactId> 
     ... 
    </parent> 

    <profiles> 
     <profile> 
      <id>pre-jdk6-profile</id> 

      <activation> 
       <jdk>(,1.6.0)</jdk> 
      </activation> 

      <dependencies> 
       <dependency> 
        <groupId>javax.xml.ws</groupId> 
        <artifactId>jaxws-api</artifactId> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 
... 
</project> 

回答

8

一)在多模塊構建,你應該始終從頂部POM建設,從來沒有從一個單獨的模塊。如果你想建立只有一個模塊,採用先進的電抗器選項(參見MVN --help)是這樣的:

mvn -pl mymodule 

b)定義並激活父POM的配置文件,但在孩子POM添加配置。

父pom.xml的

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 
     <activation> 
      <jdk>(,1.6.0)</jdk> 
     </activation> 
    </profile> 
</profiles> 

孩子的pom.xml事後

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 

     <dependencies> 
      <dependency> 
       <groupId>javax.xml.ws</groupId> 
       <artifactId>jaxws-api</artifactId> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 
+0

我是否需要將第二部分添加到模塊「A」或模塊「B」? – 2010-08-22 20:44:51

+0

兩者。在JAR中使用'提供的',在默認範圍內的webapp中。但在個人資料裏面。 – 2010-08-23 04:43:22

+0

我相信,我只能使用(b)如果我運行哈德森版本。感謝您的提示。 – 2010-09-07 13:37:16

1

幾個音符方式:

  1. 當您使用-P profName,它會激活一個名爲輪廓「 profName'
  2. 之後,它禁用所有配置文件s有一個<activation>標籤。它們是否由java版本激活並不重要,如示例中所示,或者默認情況下或env值或任何值。
  3. 這意味着-P會導致任何其他激活的配置文件變爲停用狀態。

解決方法:使用<activation><jdk>...</jdk></activation>或使用-P但不要同時使用兩者。

相關問題