ChatGPT解决这个技术问题 Extra ChatGPT

Maven 工件和 groupId 命名

我目前正在将一些项目从 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(?)


C
Community

怪异是非常主观的,我只是建议遵循官方的建议:

groupId、artifactId 和版本 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 版本,如果你分发它,那么你可以选择任何带有数字和点的典型版本(1.0、1.1、1.0.1、...)。不要使用日期,因为它们通常与 SNAPSHOT(每晚)构建相关联。如果它是第三方工件,无论它是什么,你都必须使用他们的版本号,并且看起来很奇怪。例如。 2.0、2.0.1、1.3.1


我知道这些约定,但他们并没有真正说明应该如何组成工件名称(没有 JAR 命名约定)以及如果它与 groupId 相同该怎么办 - 我还没有看到一个 POM情况就是这样。
@Noarth 1. 工件名称由您自行决定(但在名称中使用连字符是一种常见做法)。 2. 您正在寻找一个不存在的绝对“规则”(如果您的内部框架由多个模块组成怎么办?)。参见例如 Spring、Maven、Hibernate 等工件。
package 呢?与 groupId 有什么区别?
artifactId 中是否允许包含数字?
@PascalThivent 我没有公司。我在 IntelliJ 中为 SDP course project 创建了一个 maven 项目。有什么建议可以为个人项目选择这些吗?我是 Maven 的新手。
D
Dmitry Timofeev

你的约定似乎是合理的。如果我在 Maven 存储库中搜索您的框架,我会在 com.mycompany.awesomeinhouseframework 组目录中查找 awesome-inhouse-framework-x.y.jar。我会根据你的约定在那里找到它。

两个简单的规则对我有用:

groupId 的 reverse-domain-packages (因为它们非常独特)具有有关 Java 包名称的所有约束

项目名称为 artifactId(请记住,它应该是 jar 名称友好的,即不包含可能对文件名无效或看起来很奇怪的字符)


我发现非连字符(awesomeinhouseframework)和连字符(awesome-inhouse-framework)的混合拼写有点奇怪。由于 groupid 不允许使用连字符,我也会坚持使用 artifactid 的非连字符拼写。
请澄清“jar-name friendly”是什么意思?
M
Manwal

考虑以下构建基本的第一个 Maven 应用程序:

groupId

com.companyname

artifactId

项目

version

0.0.1


作为雇佣工作,我应该使用 com.my.company.project 作为 groupId 还是 com.client.company.project
@GiacomoAlzetta,您可以更好地使用任何适合您的甲酸盐。一些示例“com.companyName.hirePortal”或“org.compnayName.hirePortal”。
groupId 应该是 com.companyname 而不是 com.companyname.project
S
Stephen Rauch

但是,我不同意 Guide to naming conventions on groupId, artifactId, and version 的官方定义,该定义建议 groupId 必须以您控制的反向域名开头。

com表示该项目属于公司,org表示该项目属于社会组织。这些都可以,但是对于像xxx.tv,xxx.uk,xxx.cn这样的陌生域名,groupId以“tv.”,“cn.”开头的名称是没有意义的,groupId应该传递基本信息项目而不是域。


此约定阻止开发人员使用 maven,因为在将工件部署到中央 maven 存储库之前,您必须拥有一个域。这太荒谬了。每年拥有一个域名可能是一笔不小的成本。
不需要实际拥有该域名的注册。唯一的要求是您的组 ID(将是您的 Java 包名称)在部署时与任何其他此类名称不冲突。这个约定当然不会阻止开发人员使用 Maven。
一个好的做法是从存储库 URL 派生包名称。如果您使用 GitHub,您的帐户称为 myuser,您的存储库称为 myrepo,则只需使用包名称 com.github.myuser.myrepo。这是免费的,而且仍然是独一无二的。