2012-02-24 26 views
0

剛剛下載了m2e Eclipse插件並喜歡它!我想知道它使用什麼Web服務來解決所有項目的傳遞依賴。用於依賴關係圖的Maven服務

假設,它的工作原理是分析所有<dependency>元素的出項目pom.xml的,並使用一個服務來查詢Maven的每個傳遞依賴。

基本上,我問:m2e如何填充存儲在~/.m2處的本地Maven緩存?

回答

2

該插件的作用與Maven命令行程序mvn相同。

假設你的項目的POM和Maven設置文件不改變默認的存儲庫設置Maven會從Maven的中央下載文件

http://repo1.maven.org/maven2/

所以服用依賴性如下:

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.16</version> 
</dependency> 

的Maven將使用以下URL約定(Maven2存儲庫佈局):

<Repository URL>/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging> 

要下載兩個文件:

  1. http://repo1.maven.org/maven2/log4j/log4j/1.2.16/log4j-1.2.16.pom
  2. http://repo1.maven.org/maven2/log4j/log4j/1.2.16/log4j-1.2.16.jar

第一個是模塊POM,其包裝元素將顯示文件擴展名在下載第二個文件時使用(默認爲「jar」)。

最後Maven將遞歸讀取的POM列出的其他依賴相關的POM文件,並決定哪些其他模塊下載(依賴的依賴)

+0

非常棒的答案 - 謝謝Mark! Maven在哪裏下載這些文件到(本地)?我知道'm2e'使用'〜/ .m2' ...但是'mvn'本身呢? – IAmYourFaja 2012-02-26 16:53:30

+1

目錄「〜/。m2/repository「被稱爲本地存儲庫,我喜歡把它看作是先前從其他Maven存儲庫下載的文件的本地緩存,這樣可以提高效率並實現離線的Maven構建,看起來像m2e和mvn客戶端都使用相同的配置是有意義的 – 2012-02-26 18:05:52

3

通過運行正常的Maven依賴關係解析過程;對於每個依賴項,它遞歸地解決傳遞依賴關係。 「服務」只是來自任何配置的Maven存儲庫的依賴關係的POM查詢。

+0

那麼如何罐子居然在我的'〜/ .m2'露面目錄?他們是否神奇地表現自己?在某些時候,'m2e'必須通過網絡發送一個信號給Maven倉庫,聲明「hey!send me x」並下載。我在問這是什麼服務以及如何與它進行交互。 – IAmYourFaja 2012-02-24 21:52:14

+0

@AdamTannon它通常是普通的URI,比如'http://'或'file://',請參見[Maven repositories](http://maven.apache.org/guides/introduction/introduction-to-repositories.html )。沒有什麼特別有趣的。還有一大堆Maven-like,像Gradle等,它們使用相同的解析機制,並且源代碼可用。 – 2012-02-24 22:12:01

0

我不確定m2e是如何具體執行的,但您可以在命令行上使用mvn dependency:tree執行相同操作。該命令支持各種輸出格式:text,dot,graphml,tgf。見maven dependency plugin docs