2017-08-12 67 views
2

我知道多模塊Maven項目的意圖是每個模塊都可以獨立編譯和構建,也可以從父級統一構建。在Maven多模塊項目中,如何指定多個模塊中所需的依賴關係?

假設我的three modules中的兩個需要使用Google Guava庫。我是否在兩個子模塊中的每一個的POM中指定了依賴關係?如果是這樣,什麼「範圍」?還是我在父模塊中指定了依賴關係?我需要捆綁在我的最終產品中的番石榴,但我當然不需要兩份。

+0

在這種情況下,常見的做法是在父模塊中使用'dependencyManagement'並在那裏添加Guava依賴項。在子模塊中,您將依賴關係添加到番石榴而沒有版本和範圍(這將由父項處理)。這將防止具有不同版本的庫的不同模塊。如果您的模塊生成兩個單獨的JAR,AFAIK無法對maven說不生成「兩個副本」的依賴關係。如果它是一個web模塊,它不會創建副本.... –

+0

我不認爲你需要擔心它,因爲即使你在同一個jar的classpath中有兩個副本,其中一個會在加載時被忽略。 –

回答

1

我通常聲明所有依賴於父項目的dependencyManagement,然後在模塊的depenencies使用它們,但沒有version。版本只在父項目中聲明。

至於scope,我通常不會在父項中聲明範圍,除非它像JUnit一樣非常明顯。

我是否在兩個子模塊中的每一個的POM中指定了依賴關係?

如果你直接使用這種依賴關係,然後是。即使它會被包含在內。

如果是這樣,什麼「範圍」?

這依賴於依賴是什麼,以及你如何使用它。番石榴通常是compile

或者我指定父模塊的依賴?

您可以在parent中聲明dependencyManagement,這樣就不必在其他地方指定版本。

但你通常不會宣佈父模塊的依賴,因爲它會被所有子模塊繼承。這通常是一個假設。

我需要番石榴捆綁在我的最終產品,但我當然不需要兩個副本。

不會發生。

1

假設我的三個模塊中的兩個需要使用Google Guava庫。我是否在兩個子模塊中的每一個的POM中指定了依賴關係?

這取決於這些模塊之間的關係和你對它們做了什麼;我們稱之爲moduleA,moduleB(共享依賴關係的模塊)和moduleC(第三個模塊)。如何部署moduleAmoduleB?是否有意義,每個都有自己的同一個庫的副本?

  • 例如,如果它們都是獨立運行的WAR,則需要爲每個自己的庫提供一份副本。
  • 如果他們是在同一場戰爭(可能由moduleC表示)結束了兩罐子,那麼你會希望他們每個人給的依賴與scope=provided,並添加第三依賴於moduleC使用默認範圍。

還是我指定父模塊的依賴關係?

在父模塊中指定依賴關係的問題是依賴關係也會被moduleC拾取,這可能不是您想要的。

一種可能性來解決這個(例如,如果moduleAmoduleB份額很大的依賴性,或共同屬性或設置的)是添加共同的父:

  • 一個額外的父POM /反應器,用於moduleAmoduleB,但不是moduleC
  • 這個額外的父pom將與樹moduleC(因此它將有相同的父母moduleC)在同一級別。
  • 它將包含任何moduleAmoduleB有共同之處。
+0

我沒有看到第三個子模塊獲取依賴關係(好)。在父類中,我使用'groupid','artifactid'和'version'來指定依賴項。在兩個子模塊的每一箇中,我省略了'version'。 IntelliJ'Maven'面板顯示兩個子模塊中的每一個都帶有Guava庫的副本,但不包含第三個子模塊(好)。在我構建的Vaadin 8(Java Servlet)項目的WEB-INF/lib'文件夾中,我找到只有一個Guava的庫的列表。所以我認爲這對我來說已經足夠了。但是我還沒有在每個模塊中實現單元測試。 –

+0

對不起,我不知道我理解100%。如果3個模塊共享一個依賴項時,只有其中的2個擁有該依賴項,則最終只會在'WEB-INF/lib'中有一個jar,因爲依賴項在所有3種情況下都具有相同的名稱,所以只有其中一個會「贏」(其他兩個副本由於文件具有完全相同的名稱而被覆蓋)。 – Andrei

+0

我指的是有關在父模塊中指定依賴關係的部分。如果該子模塊的POM具有指定的「」,但子模塊僅在中間階段獲得副本('IntelliJ'>'Maven Projects'>'my-sub-module'>'Dependencies'),但省略版本數字(其中父母POM指定'')。 –

相關問題