2016-03-11 137 views
4

我遇到了JIRA post,它給出了一個解決方案,在POM的每個依賴標籤中包含排除標籤。如何關閉maven項目的傳遞依賴關係?

但我有大量的項目,每個項目都有大量的依賴標籤。將這個<exclusion>包含在每個依賴關係標記中是不可行的。

問題:有沒有辦法在全球範圍內關閉Maven中傳遞依賴的進口?

+0

但是,爲什麼要爲所有項目的所有依賴關係提供這樣的機制?在這種情況下,螞蟻可能是更好的選擇。否則,腳本可以完成這項工作,但它很容易成爲維護噩夢ihmo。 –

+0

出於安全考慮,我們需要這樣做。我們有一個Artifactory回購站,我們維護所有且只需要的依賴關係。我們不希望不必要的依賴性蔓延到包中。我很想知道你所指的螞蟻腳本會做什麼。你能解釋一下這個解決方案嗎?它是否與POM上的文本替換相同? – AshwiniR

+0

但是,離線切換Artifactory並不容易,因此您可以完全控制其內容?我的意思是ant,因爲你使用物理文件作爲依賴關係,而不是聲明和傳遞式管理,所以你可以完全控制你正在使用的東西。我想到的腳本可能與下面解釋的解決方案的確如此。 –

回答

3

在Maven中你不能在一個單一的方式關閉傳遞依賴的所有聲明依賴性,如official documentation

爲什麼排除規則在每個依賴基礎上進行,而不是在POM水平

這主要是爲了確保依賴關係圖是可預測的,並保持繼承效應不排除不應排除的依賴關係。如果你接觸到最後的手段並且必須排除,你應該完全確定你的哪個依賴引入了這種不需要的傳遞依賴。


實際上,由於Maven的3.2.1你可以指定通配符來排除所有傳遞依賴於特定的相關性,但是這仍然是每依賴,而不是全球性的。

你真正想擁有像每一個的每以下,並在每個每個依賴和每一個POM(!!)什麼:

<dependency> 
    <groupId>groupId</groupId> 
    <artifactId>artifactId</artifactId> 
    <version>version</version> 
    <exclusions> 
     <exclusion> 
      <groupId>*</groupId> 
      <artifactId>*</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

雖然這是不可取的,因爲它可能很容易(和負面的)影響有關項目的可維護性,一個可能的解決方案將是對所有有關項目的共同parent POM,讓每個POM將宣佈:

<parent> 
    <groupId>com.sample</groupId> 
    <artifactId>projects-governance</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

然後,在相關父POM你會:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sample</groupId> 
    <artifactId>modules</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <dependencyManagement> 
     <dependencies> 
      <!-- for each and every foreseen dependency of children poms --> 
      <dependency> 
       <groupId>groupId</groupId> 
       <artifactId>artifactId</artifactId> 
       <version>version</version> 
       <exclusions> 
        <exclusion> 
         <groupId>*</groupId> 
         <artifactId>*</artifactId> 
        </exclusion> 
       </exclusions> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 
</project> 

注意dependencyManagement部分,在這裏我們要說:一切爲了孩子的POM,只要您使用有關的依賴我宣佈,這個groupId和這個artifacId默認情況下這個版本,這排除將被應用。

這個解決方案的主要優點是你集中了這個機制/管理,至少你不必碰每個POM(除了關於新父母的變化)。

但是,您仍然需要在父POM中列出所有項目使用的所有依賴項,併爲所有項目應用通配符排除。


要獲得每個項目的所有依賴關係列表,您可以使用手動方法(打開每個POM!),或在每個項目上運行以下命令:然後

mvn dependency:list -DexcludeTransitive=true -DoutputFile=dependencies.txt -DappendOutput=true 

Maven Dependency Plugin將在指定的dependencies.txt文件寫聲明的依賴性(在相關項目的格式groupId:artifactId:packaging:version:scope)。請注意,最後一個參數appendOutput可能有助於在同一個文件的末尾寫入,以便將它們集中進行進一步處理(刪除重複項,並將它們移動到新父項目)。


要應用通配符的所有聲明的依賴性,快速提示是簡單地取代(通過shell腳本任何文本編輯器或)以下令牌:

</version> 
</dependency> 

通過以下的:

</version> 
    <exclusions> 
     <exclusion> 
      <groupId>*</groupId> 
      <artifactId>*</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

然後保存該文件。並且自動地以一種相當安全的方式將通配符排除應用於所有的依賴關係。

OP更新:最後,我們決定不這樣做,而是通過使用依賴關係樹命令爲每個項目生成新添加/刪除的依賴關係的報告並將其廣播,從而解決原始問題。

+0

我通讀了官方文檔。謝謝。他們更多地從用戶定義的項目視圖中進行說明但我更關心的是Maven從它的中央存儲庫中抽取的工件。這種方法最終也是我想到的。猜猜必須這樣做.. – AshwiniR