2009-05-05 26 views
6

假設您有一個項目正在使用第三方庫,如Google's Analytics Data API (gdata),該項目似乎目前尚未部署到任何衆所周知的或流行的Maven公共存儲庫/索引中。這不是什麼大問題,因爲我可以將工件部署到本地託管的Nexus存儲庫中。將第三方庫安裝到託管的Maven存儲庫中的最佳做法?

但是,在Maven社區中是否有任何最佳實踐,我應該如何在POM中命名該庫的「座標」,因爲尚未在公共存儲庫中爲其設置標準?

舉例來說,我應該是指它在我的POM作爲

<dependency> 
    <groupId>com.google</groupId> 
    <artifactId>gdata-analytics</artifactId> 
    <version>1.0</version> 
</dependency> 

或者是有一些更好/更標準的辦法,我拿出artifactId? (而且,爲什麼Google不會像Google這樣的幾十個庫的提供者花費一些精力將它們託管到主流的公共Maven倉庫/索引中?難道這不會讓人們更容易使用他們並因此推動採用?)

回答

3

你所做的是非常合理的。幾個額外的點:

  • 當Maven從Nexus獲取工件時,該工件被命名爲artifactId版本。 GroupId惱人地被省略。因此,當工件被移動(例如,複製到Web應用程序中的WEB-INF/lib中)時,您的jar文件將顯示爲「gdata-analytics-1.0」。這通常不是問題。但是,如果工件名稱非常常見,例如「util」,則可能需要在工件標識中包含組信息,例如使用groupId「com.google」和工件編號「com.google.gdata-分析「。是的,重新編制令人討厭,但它在文件系統和搜索中產生了最大的清晰度。實際上,我遇到了一個問題,其中兩個不同的groupId都有一個「core-1.0」jar,並且在構建時拷貝到lib目錄中的一個覆蓋了另一個。

  • 我第二次MattK建議您將Maven versionId與任何通常已知的工件版本對齊。

  • 如果您按照Dominic的建議在您的公司名稱前加上groupId(例如acme),可能會更容易利用Nexus的路由功能。這將確保內部文物的請求不會被傳播出去的Maven中央,並在其日誌中結束(可能是重要的,如果你的groupId是「acme.secret.project」!

+0

所有不錯的建議 - 這就是爲什麼我接受這個答案。順便說一句,我部署的谷歌分發的JAR已經被命名爲「gdata-analytics-1.0.jar」,這是我從中獲取我的工件和版本號的地方。必須愛好JAR命名 – 2009-05-05 18:31:54

3

我一直在使用Maven大約一年,從未運行過「標準」命名約定。儘管我儘可能使版本號儘可能接近「真實」版本號,但我通常只是在做你正在做的事情,只是爲了避免在部署多個版本時出現混淆。

+0

這正是我所做的 - 但感謝您的反饋 – 2009-05-05 18:27:22

2

我有一種傾向,用我自己平時的groupId作爲groupId的前綴。這很清楚,這是我上傳的東西,以防萬一它泄漏到整個世界。

0

sourceforge上的許多項目在groupid中使用項目名稱,例如:

GroupId net.sf.json-lib ArtifactId json-lib

這可能適用於谷歌的例子,因爲有很多谷歌文物。

請記住,您可以使用classifer標籤來區分相同版本的兩個罐子 ,但是爲不同的目的而構建,例如不同的JVM。

0

你可能很幸運:谷歌有他們自己的項目Maven回購。看到這個頁面:Instructions

我有幾個Jar文件是專有的,所以我不得不在每個工作站上加載它們(我們還沒有公司共享回購協議)。我將它們放在/ lib目錄中的源代碼樹中(並不總是一個好主意),並添加了一個包含mvn install-file命令的小型.BAT文件(或.sh腳本),以便第一次加載本地機器的回購我建立的時間。如果我不得不更新這些罐子,我還會更新「load.bat」文件,然後重新運行它。在我的情況下,我不希望這種情況每年發生一次以上,也許會少一次。

+0

謝謝 - 但這個回購看起來對我來說不是很流行。我在原始帖子中提到的神器不在那裏。 – 2009-07-09 12:59:53

相關問題