2016-11-17 54 views
-3
  • 假設有2個maven構件(本地)具有相同的 groupId但具有不同的artifactId。
  • 不同的artifactId應該使每個maven神器獨一無二。
  • 但是,如果兩個獨特的工件都具有共享相同名稱的類。該類不會是唯一的,因爲當它被導入到java時,它將使用groupId.className格式。並且groupId和className都不唯一(在討論的情況下)。
  • 這將導致一個模糊的問題,以確定使用哪個類。
  • 經過測試,似乎會使用在pom.xml文件中首先聲明的依賴項。

問題是maven中的artifactId的唯一性

  1. 什麼是最好的做法解決/避免這個問題?
  2. 爲什麼maven的artifactId座標有助於存儲庫內的maven工件的唯一性,但不在java代碼內部?

例如代碼: Maven - Same Class Name Same GroupId Different ArtifactId

  • PROJECT1是第一工件。
  • Project2是第二個神器。
  • 「項目用戶」是將取決於Project1 & Project2的工件/項目。
  • Project1 & Project2都有一個名爲Utilities的類。
  • Utilities有一個靜態方法public static String getDescription()返回一個string包含當前項目的工件座標以及項目名稱。
  • Utilities.getDescription()結果String被調用以查看某個地方是否會發生錯誤,並查看它將如何解決。
  • 輸出取決於在「Projects User」工件的pom.xml文件中首先聲明瞭哪個依賴項。

編輯:跟進問

  • 是否有將同時使用的artifactId和的groupId,而不必做手工每次 時間創建Java包的原型?
+1

類的名稱無關與製品或者的groupId – Jens

+0

Java類,比如'com.mypackage進行訪問。 MyClass不是'groupId.MyClass'。我想,你有兩個具有相同包和同一類的工件。 – NewUser

+0

軟件包名稱應該是唯一的。例如,您應該使用您控制的域名或某種獨特的暱稱或其他類型,然後使用項目名稱。 – xenteros

回答

2

什麼是最好的做法解決/避免這個問題?

我們在模塊中包含groupId和artifactId作爲基礎包。這樣就不可能在兩個模塊中擁有相同的類,因爲這些包會有所不同。

例如

<groupId>net.openhft</groupId> 
<artifactId>chronicle-bytes</artifactId> 

有包下的一切

package net.openhft.chronicle.bytes; 

另外,如果你知道你知道它必須是在JAR。

,如果你有一類兩個JAR需要一個類的包,我建議創建一個通用模塊,它們都依賴於。

注意:通常的做法是使用公司域名(以及名義劃分)作爲您的軟件包的基礎。 Maven建議在您的groupId中使用您的域名,如果您發佈到Maven Central,現在這是一項要求。上述策略支持這兩個建議。

爲什麼maven的artifactId座標有助於存儲庫中的maven工件的唯一性,但不在java代碼中?

Maven沒有注意到JAR內容。

+1

我還會添加信息,Maven建議將您的域名用作groupId – xenteros

2

@Peter跟隨您的建議,以避免此問題的最佳做法。

  1. 組編號:需要唯一標識您的項目。反映您的域名例如: com.github.dibyaranjan
  2. artifactId是沒有版本的jar名稱。

要區分來自不同JAR的兩個類,請將包創建爲groupId.artifactId。

例如,我會創建一個TestDummy項目,我想讓JAR的名稱爲TestDummy-1.1,然後我的包就會看起來像。

com.github.dibyaranjan.testdummy

類會是什麼樣子 - com.github.dibyaranjan.testdummy.MyClass

僅供參考,請訪問:https://maven.apache.org/guides/mini/guide-naming-conventions.html

相關問題