modules
標記是一個聚合。它不被視爲與dependencies
相同。請注意,您在dependency
和module
中指定的值是不同的。當您聲明dependency
時,您指定maven coordinates。 module
,你指定relative directories。
您最終會針對遠程服務器的模塊或本地模塊進行編譯嗎?
你將永遠結束了對編譯本地模塊如果你的聚合器模塊在運行mvn compile
(子模塊不在!)和子模塊依賴是兄弟依賴。當您在聚合器模塊中使用mvn compile
時,編譯子模塊時的依賴關係查找將是特殊的。它會從兄弟模塊目標文件夾僅看。我找不到關於此的文檔,但您可以嘗試一下。
試想一下,你有這些聚合POM
...
<modules>
<module>child-a</module>
<module>child-b</module>
</modules>
....
孩子-B POM是聲明對孩子-A的依賴。 (確保你有一個真正的輸出類)
接下來,當你mvn compile
聚合pom,child-b將能夠編譯,即使你有沒有mvn install
child-a之前。這意味着,child-a甚至不在您的本地存儲庫中。這是可能的,因爲maven會查看子級的目標文件夾。要確認這一點,你可以嘗試運行mvn compile clean
(是的,編譯後清理)。
請再次注意,這種行爲僅適用於從聚合器pom運行它時。如果你當前的工作目錄是child-b(依賴於child-a),它會在嘗試查找child-a時遵守updatePolicy。
關於編譯子模塊時依賴查找的一點是特別的。它將僅從兄弟模塊目標文件夾中查看。我相信Maven總是首先嚐試解決反應堆內的依賴關係。它只會從repo中查找,如果這種依賴關係在反應堆中不可用。我不確定它是否在doc中明確描述過(我相信如此),但是它也是直接的,因爲如果它不能像那樣工作,那麼當我簡單地執行'mvn compile'時,它將會是一團糟。 –
不幸的是,這是'mvn compile'的當前行爲。你說的是'mvn install'是正確的。爲了進一步證實這一點,我們可以嘗試用兩個命令的-X來運行它們。在-X中的'mvn compile'類路徑是:child-b \ target \ classes,child-a \ target \ classes。在-X中的'mvn install' classpath是:child-b \ target \ classes,.m2 \ child-a \ 1.0-SNAPSHOT \ child-a-1.0-SNAPSHOT.jar。我猜測,如果你使用'compile',maven不能假定child-a.jar會在任何倉庫中,所以它正在使用child-a \ target \ classes。 – ceilfors
我寧願相反的想法:因爲你使用的是安裝,因此Maven知道依賴將被安裝到本地回購,即使它是當前項目中的一個模塊。這使得它可以很好地指向本地回購的JAR。對於編譯,因爲依賴項(它是當前項目中的一個模塊)不會安裝在本地回購站中,爲了使用正確的依賴關係進行構建,Maven會將該模塊的輸出目錄置於反應堆中。 –