2013-06-12 50 views
3

This is just like this other question I asked, but instead of dependencies, this is about modules.讓我給一個場景。您有一個多module項目和一個部署該項目的持續集成服務器。這部署到一個存儲庫,您的本地settings.xmlupdatePolicyalways。現在想象一下,CI在部署項目後立即運行mvn compile在Maven中,模塊是否受存儲庫的updatePolicy影響?

您最終會針對遠程服務器的modules或您的本地模塊進行編譯嗎?

換句話說,存儲庫的updatePolicymodule標記有什麼影響嗎?

回答

3

modules標記是一個聚合。它不被視爲與dependencies相同。請注意,您在dependencymodule中指定的值是不同的。當您聲明dependency時,您指定maven coordinatesmodule,你指定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。

+0

關於編譯子模塊時依賴查找的一點是特別的。它將僅從兄弟模塊目標文件夾中查看。我相信Maven總是首先嚐試解決反應堆內的依賴關係。它只會從repo中查找,如果這種依賴關係在反應堆中不可用。我不確定它是否在doc中明確描述過(我相信如此),但是它也是直接的,因爲如果它不能像那樣工作,那麼當我簡單地執行'mvn compile'時,它將會是一團糟。 –

+0

不幸的是,這是'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

+1

我寧願相反的想法:因爲你使用的是安裝,因此Maven知道依賴將被安裝到本地回購,即使它是當前項目中的一個模塊。這使得它可以很好地指向本地回購的JAR。對於編譯,因爲依賴項(它是當前項目中的一個模塊)不會安裝在本地回購站中,爲了使用正確的依賴關係進行構建,Maven會將該模塊的輸出目錄置於反應堆中。 –

相關問題