Maven构件和groupId命名

352

我正在把一些项目从Ant迁移到Maven。作为一个符合规范的人,我想使用已经建立的约定来寻找groupIdartifactId,但是我找不到任何详细的约定(有些约定存在,但它们没有涵盖我想知道的点)。

以这个项目为例,先看Java包:com.mycompany.teatimer

Tea timer实际上是两个单词,但Java包命名约定禁止插入下划线或连字符,所以我写在一起。

我选择了与包ID相同的groupId,因为我认为这是一个好主意。不是吗?

最后,我必须选择一个artifactId,目前我选择了teatimer。但是当我看其他Maven项目时,它们使用连字符将artifactId中的单词分开,像这样:tea-timer。但是当它连接到groupId时,看起来很奇怪:com.mycompany.teatimer.tea-timer

你会怎么做呢?

另一个例子:

包名称:com.mycompany.awesomeinhouseframework

groupIdcom.mycompany.awesomeinhouseframework(?)

artifactIdawesome-inhouse-framework(?)

4个回答

285
个人观点不同,我建议遵循官方推荐:
引用:

groupId、artifactId和version命名规范指南

  • groupId将在所有项目中唯一标识您的项目, 因此我们需要强制使用命名模式。 它必须遵循包名称规则, 也就是至少要作为您控制的域名, 并且您可以创建任意多个子组。 查看更多有关包名称的信息

    例如: org.apache.maven, org.apache.commons

    确定groupId的粒度的好方法是使用项目结构。 也就是说,如果当前项目是多模块项目,则应该在父级的groupId后附加一个新标识符。

    例如: org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting

  • artifactId是不带版本号的jar包的名称。 如果是自己创建的,则可以选择任何小写字母和无奇怪符号的名称。 如果是第三方jar包,则必须使用分发的jar包名称。

    例如: maven, commons-math

  • version如果你进行分发,则可以选择任何具有数字和点(1.0, 1.1, 1.0.1等)的典型版本。 不要使用日期,因为它们通常会与构建时间混淆。

快照(每夜构建)版本。如果它是第三方的工件,你必须使用它们的版本号,不管它看起来有多奇怪。

例如:2.02.0.11.3.1


11
我了解这些规定,但它们并没有明确说明制作构件名称的方法(没有 JAR 命名约定),如果与 groupId 相同该怎么办 - 我从未见过单个 POM 是这种情况。 - Noarth
11
package是Maven构建中的一个元素,用于定义项目的Java包名。groupId是Maven坐标中的一个元素,用于唯一标识一个项目的组织或者公司。它们在Maven构建过程中有不同的作用。 - KonstantinK
1
artifactId允许包含数字吗? - theonlygusti
1
@PascalThivent 我没有公司。我在IntelliJ中为SDP课程项目创建了一个maven项目。对于个人项目,有什么建议可以选择这些吗?我是Maven的新手。 - alhelal
关于“受雇工作”的情况怎么处理呢?我应该选择groupIdcom.client.website还是com.my.website?根据这个答案,应该选择com.my.website,因为我不能控制客户网站...但是我感觉应该使用代码真正的所有者的“站点”,这意味着使用com.client.website - Giacomo Alzetta
显示剩余3条评论

167
您的规则看起来很合理。如果我在Maven仓库中搜索您的框架,我会在com.mycompany.awesomeinhouseframework组目录中查找awesome-inhouse-framework-x.y.jar。根据您的规则,我会在那里找到它。
对我而言,有两个简单的规则:
  • groupId使用反向域包命名(由于这样非常独特),并遵循Java包名称的所有限制
  • artifactId使用项目名称(请记住,它应该友好地命名为jar文件,即不包含可能无效的文件名字符或看起来奇怪的字符)

1
我觉得非连字符(awesomeinhouseframework)和连字符(awesome-inhouse-framework)混合拼写有点奇怪。由于groupid不允许使用连字符,因此我会在artifactid中坚持使用非连字符拼写。 - Michael Küller
4
请问"jar-name friendly"是什么意思? - vikramvi
1
官方文档与您的观点一致:“在groupId中使用连字符是完全可以接受的,您无需更改Java包名称以匹配它。” https://central.sonatype.org/publish/requirements/coordinates/ - undefined
官方文档与您的观点一致:“在groupId中使用连字符是完全可以接受的,您无需更改Java包名称以匹配它。” https://central.sonatype.org/publish/requirements/coordinates/ - Ellen Spertus

114
考虑以下内容以构建基本的Maven应用程序: - groupId:com.companyname - artifactId: project - version: 0.0.1

作为一项委托工作,我应该使用 com.my.company.project 还是 com.client.company.project 作为 groupId - Giacomo Alzetta
@GiacomoAlzetta 你可以使用任何适合你的格式。一些例子是“com.companyName.hirePortal”或“org.compnayName.hirePortal”。 - Manwal
8
groupId 应该是 com.companyname 而不是 com.companyname.project。 - Kamil Nękanowicz
2
其实这并不是设计的本意,Apache鼓励在groupId中添加项目/模块名称:https://maven.apache.org/guides/mini/guide-naming-conventions.html - Olix

0

然而,我不同意命名规范指南:groupId、artifactId 和 version的官方定义,该定义建议 groupId 必须以您控制的反向域名开头。

com 表示此项目属于公司,org 表示此项目属于社会组织。这些都没问题,但对于那些奇怪的域名,如 xxx.tv、xxx.uk、xxx.cn,用 "tv."、"cn." 开头的 groupId 没有意义,groupId 应该传递项目的基本信息,而不是域名。


7
由于必须拥有一个域名才能将您的构件部署到中央Maven存储库,因此该规定阻止开发人员使用Maven。这太荒谬了,每年拥有一个域名可能是一笔相当高的成本。 - Tommy.Tang
5
在拥有域名注册的情况下是没有要求的。唯一要求的是你的组ID(将成为Java包名)在部署时不与任何其他名称发生冲突。这个约定当然不会阻止开发者使用Maven。 - Basil Bourque
10
一个好的实践是从代码库的 URL 中派生出包名。如果您正在使用 GitHub,您的账户名为 myuser,仓库名为 myrepo,那么只需使用包名com.github.myuser.myrepo。这是免费的且独一无二的。 - fxnn
Maven Central的管理员现在要求使用反向域名。https://central.sonatype.org/publish/requirements/coordinates/ - Ellen Spertus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接