2009-11-24 99 views
15

我有一個具有一些依賴關係的maven模塊。在特定的配置文件中,我想排除一些這些依賴關係(確切地說,所有與某個特定組ID相關的依賴關係)。但是他們需要在所有其他配置文件中出現。有沒有一種方法來指定配置文件的依賴項的排除?排除配置文件中的依賴關係

+0

你能告訴我們更多關於你的用例嗎?如果你的模塊有依賴性,爲什麼你需要排除它們? – 2009-11-24 13:36:02

+0

該模塊是eclipse RCP應用程序的一部分。它取決於應用程序的其他模塊以及大量的RCP軟件包。我想使用這個配置文件來創建eclipse目標平臺。這需要包含所有依賴項,除了那些屬於應用程序的部分。目前這是通過編輯POM,刪除屬於應用程序本身的所有依賴項,運行mvn eclipse:installbundles,然後再次編輯POM來完成的。這顯然很容易出錯。 – 2009-11-24 13:46:58

回答

11

據我所知,沒有,你不能關閉的依賴(可以排除傳遞依賴,但這不是你所要求的)和,您目前正在與POM做什麼(手動編輯這是錯誤的。

所以,而不是刪除的依賴,你應該把它們放在一個配置文件,並且:

  • 選項#1:需要時或使用該配置文件
  • 選項#2:標記輪廓由作爲激活默認或將其放入活動配置文件列表中,並在需要時將其停用。

第三個選擇是(而不是個人資料爲基礎):

  • 選項#3:在兩個獨立的模塊不同的東西(如你已經分居問題)和使用繼承。
+0

這種方法的問題是我需要依賴關係幾乎總是在那裏。我需要每3個月創建一次目標平臺。因此,不得不在每個版本上指定配置文件比手動編輯POM更麻煩。不幸的是,標記爲默認激活的配置文件在另一個配置文件被激活時會被取消激活,所以這對我來說不會有幫助,因爲經常有其他配置文件激活 – 2009-11-24 14:08:28

+0

我不會爲配置文件爭論以及如何使用它們,我只是給你提供可能的解決方案。但是,不,你不能停用依賴關係(你只能排除傳遞依賴關係)。如果你不想要它們,創建另一個模塊。 – 2009-11-24 14:27:10

+0

我認爲這是一個很好的答案,不能理解你爲什麼不能使用Option#2方法。只需將所述依賴關係放置在默認配置文件中,並創建另一個沒有依賴關係的配置文件,並在您要描述的情況下構建時激活它(取消激活默認配置文件)。 – 2011-03-08 20:17:52

3

我不認爲有可能排除直接依賴關係(至少沒有提到here)。

您可以做的最好的事情是將每個案例的所需依賴關係放入不同的配置文件(如已經建議的那樣),但是,您需要創建兩個「互斥」配置文件,其中一個「active默認」。實現此目標最可靠的方法是使用參數激活配置文件,例如

<profiles> 
    <profile> 
    <id>default-profile</id> 
    <activation> 
     <property><name>!exclude</name></property> 
    </activation> 
    <dependencies> 
     dependency-A 
     dependency-B 
     ... 
    </dependencies> 
    </profile> 

    <profile> 
    <id>exclude-profile</id> 
    <activation> 
     <property><name>exclude</name></property> 
    </activation> 
    <!-- exclude/replace dependencies here --> 
    </profile> 
</profiles> 

然後使用「MVN [目標]」將使用配置文件「默認配置文件」,但「MVN [目標] -Dexclude」將使用配置文件「排除矚目」。

請注意,對於「默認」配置文件使用「activeByDefault」而不是參數可能在某些情況下有效,但也可能導致意外行爲。問題在於,只要在多模塊構建的任何其他模塊中沒有其他活動配置文件,'activeByDefault'就會使配置文件處於活動狀態。

5

發生在我身上的一種方法是將依賴項放在單獨的pom中。然後,您可以通過配置文件添加<exclusions>部分。

<dependencies> 
    <dependency> 
     <groupId>my.company.dependencies</groupId> 
     <artifactId>my-dependencies</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
     <type>pom</type> 
    </dependency> 
</dependencies> 

<profile> 
    <activation> 
     <activeByDefault>false</activeByDefault> 
     <property> 
      <name>exclude-deps</name> 
     </property> 
    </activation> 

    <dependencies> 
     <dependency> 
      <groupId>my.company.dependencies</groupId> 
      <artifactId>my-dependencies</artifactId> 
      <version>1.0.0-SNAPSHOT</version> 
      <type>pom</type> 
      <exclusions> 
       <exclusion> 
        <groupId>my.company</groupId> 
        <artifactId>bad-dep-1</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>my.company</groupId> 
        <artifactId>bad-dep-2</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
</dependencies> 
</profile> 
4

而是在配置文件中不包括相關性,你可以將它們設置爲在它provided。這不需要任何過於複雜的配置,並且會排除您不希望從最終版本生成的依賴關係。

在所需的配置文件中,添加一個dependencies部分,複製要排除的部分的聲明並將其範圍限定爲provided

例如,我們說要排除slf4j-log4j12

<profiles> 

    <!-- Other profiles --> 

    <profile> 
     <id>no-slf4j-log4j12</id> 
     <dependencies> 
      <dependency> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-log4j12</artifactId> 
       <version>1.7.2</version> 
       <scope>provided</scope> 
      </dependency> 
     </dependencies> 
    </profile> 

    <!-- Other profiles --> 

</profiles> 
0

有點髒,但輕便的解決方案是使用<scope>import</scope>

不同於其他領域,你可以這樣做:

  • 將禁用編譯時和運行時的依賴條件;不像providedruntime其中僅禁用一次一個
  • 不會弄亂你的test範圍
  • 你不需要指定一些虛擬的jar路徑將system範圍需要

沒有得到只要你在dependencyManagement之外使用這個黑客就可以進口。