我知道多模塊Maven項目的意圖是每個模塊都可以獨立編譯和構建,也可以從父級統一構建。在Maven多模塊項目中,如何指定多個模塊中所需的依賴關係?
假設我的three modules中的兩個需要使用Google Guava庫。我是否在兩個子模塊中的每一個的POM中指定了依賴關係?如果是這樣,什麼「範圍」?還是我在父模塊中指定了依賴關係?我需要捆綁在我的最終產品中的番石榴,但我當然不需要兩份。
我知道多模塊Maven項目的意圖是每個模塊都可以獨立編譯和構建,也可以從父級統一構建。在Maven多模塊項目中,如何指定多個模塊中所需的依賴關係?
假設我的three modules中的兩個需要使用Google Guava庫。我是否在兩個子模塊中的每一個的POM中指定了依賴關係?如果是這樣,什麼「範圍」?還是我在父模塊中指定了依賴關係?我需要捆綁在我的最終產品中的番石榴,但我當然不需要兩份。
我通常聲明所有依賴於父項目的dependencyManagement
,然後在模塊的depenencies
使用它們,但沒有version
。版本只在父項目中聲明。
至於scope
,我通常不會在父項中聲明範圍,除非它像JUnit一樣非常明顯。
我是否在兩個子模塊中的每一個的POM中指定了依賴關係?
如果你直接使用這種依賴關係,然後是。即使它會被包含在內。
如果是這樣,什麼「範圍」?
這依賴於依賴是什麼,以及你如何使用它。番石榴通常是compile
。
或者我指定父模塊的依賴?
您可以在parent中聲明dependencyManagement
,這樣就不必在其他地方指定版本。
但你通常不會宣佈父模塊的依賴,因爲它會被所有子模塊繼承。這通常是一個假設。
我需要番石榴捆綁在我的最終產品,但我當然不需要兩個副本。
不會發生。
假設我的三個模塊中的兩個需要使用Google Guava庫。我是否在兩個子模塊中的每一個的POM中指定了依賴關係?
這取決於這些模塊之間的關係和你對它們做了什麼;我們稱之爲moduleA
,moduleB
(共享依賴關係的模塊)和moduleC
(第三個模塊)。如何部署moduleA
和moduleB
?是否有意義,每個都有自己的同一個庫的副本?
moduleC
表示)結束了兩罐子,那麼你會希望他們每個人給的依賴與scope=provided
,並添加第三依賴於moduleC
使用默認範圍。還是我指定父模塊的依賴關係?
在父模塊中指定依賴關係的問題是依賴關係也會被moduleC
拾取,這可能不是您想要的。
一種可能性來解決這個(例如,如果moduleA
和moduleB
份額很大的依賴性,或共同屬性或設置的)是添加共同的父:
moduleA
和moduleB
,但不是moduleC
。moduleC
(因此它將有相同的父母moduleC
)在同一級別。moduleA
和moduleB
有共同之處。我沒有看到第三個子模塊獲取依賴關係(好)。在父類中,我使用'groupid','artifactid'和'version'來指定依賴項。在兩個子模塊的每一箇中,我省略了'version'。 IntelliJ'Maven'面板顯示兩個子模塊中的每一個都帶有Guava庫的副本,但不包含第三個子模塊(好)。在我構建的Vaadin 8(Java Servlet)項目的WEB-INF/lib'文件夾中,我找到只有一個Guava的庫的列表。所以我認爲這對我來說已經足夠了。但是我還沒有在每個模塊中實現單元測試。 –
對不起,我不知道我理解100%。如果3個模塊共享一個依賴項時,只有其中的2個擁有該依賴項,則最終只會在'WEB-INF/lib'中有一個jar,因爲依賴項在所有3種情況下都具有相同的名稱,所以只有其中一個會「贏」(其他兩個副本由於文件具有完全相同的名稱而被覆蓋)。 – Andrei
我指的是有關在父模塊中指定依賴關係的部分。如果該子模塊的POM具有指定的「
在這種情況下,常見的做法是在父模塊中使用'dependencyManagement'並在那裏添加Guava依賴項。在子模塊中,您將依賴關係添加到番石榴而沒有版本和範圍(這將由父項處理)。這將防止具有不同版本的庫的不同模塊。如果您的模塊生成兩個單獨的JAR,AFAIK無法對maven說不生成「兩個副本」的依賴關係。如果它是一個web模塊,它不會創建副本.... –
我不認爲你需要擔心它,因爲即使你在同一個jar的classpath中有兩個副本,其中一個會在加載時被忽略。 –