maven中artifactId的唯一性

时间:2016-11-17 11:17:07

标签: java maven

  • 让我们说有2个相同的maven工件(本地) groupId但具有不同的artifactId。
  • 不同的artifactId应该使每个maven工件都是唯一的。
  • 但是,如果两个唯一的工件都有一个具有相同名称的类。该类不是唯一的,因为当它被导入到java时,它将使用groupId.className格式。并且groupId和className都不是唯一的(在讨论的情况下)。
  • 这将导致确定使用哪个类的歧义问题。
  • 在测试时,似乎将使用在pom.xml文件中首先声明的依赖项。

问题

  1. 解决/避免此问题的最佳做法是什么?
  2. 为什么maven的artifactId坐标会影响存储库中maven工件的唯一性,而不是java代码内部的唯一性?
  3. 示例代码: Maven - Same Class Name Same GroupId Different ArtifactId

    • Project1是第一件神器。
    • Project2是第二件神器。
    • "项目用户"是依赖于Project1和Project的工件/项目。项目2。
    • Project1& Project2都有一个名为Utilities
    • 的类
    • 班级Utilities有一个静态方法public static String getDescription(),它返回一个string,其中包含当前项目的工件坐标以及项目名称。
    • Utilities.getDescription()调用生成的String以查看是否会在某处发生错误,并了解如何解决错误。
    • 输出取决于首先在" Projects User"的pom.xml文件中声明了哪个依赖项。工件。

    已编辑:跟进问题

    • 是否存在使用artifactId和groupId创建java包的原型,而不是每次都需要手动执行 时间吗

2 个答案:

答案 0 :(得分:2)

  

解决/避免此问题的最佳做法是什么?

我们在模块中包含groupId和artifactId作为基础包。这样就不可能在两个模块中具有相同的类,因为包将是不同的。

e.g。

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

包含

下的所有内容
package net.openhft.chronicle.bytes;

此外,如果你知道一个类的包,你就知道它必须在哪个JAR中。

如果你有两个JAR需要,我建议创建一个公共模块,它们都依赖。

注意:通常的做法是使用您的公司域名(以及名义部门)作为您的包的基础。 Maven建议您使用您的域名作为groupId,如果您发布到Maven Central,现在这是一项要求。上述策略支持两种建议。

  

为什么maven的artifactId坐标会影响存储库中maven工件的唯一性,而不是java代码中的maven工件的唯一性?

Maven没有注意到JAR的内容。

答案 1 :(得分:2)

@Peter跟随您的主导,建议避免此问题的最佳做法。

  1. 组ID:需要唯一标识您的项目。请注意您的域名ex: com.github.dibyaranjan
  2. artifactId是没有版本的jar的名称。
  3. 要将两个类与不同的JAR区分开来,请将package创建为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