Maven工件和groupId命名


291

我目前正在将一些项目从Ant移到Maven。像我一样,我想使用完善的约定来查找groupIdartifactId,但是我找不到任何详细的约定(有一些约定,但是它们没有涵盖我想知道的要点)。

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

Tea timer实际上是两个词,但是Java包命名约定禁止插入下划线或连字符,因此我将它们全部编写在一起。

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

最后,我必须选择一个artifactId,我目前参加了teatimer。但是当我查看其他Maven项目时,它们使用连字符将artifactIds中的单词拆分,如下所示:tea-timer。但是当连接到groupId:时看起来确实很奇怪com.mycompany.teatimer.tea-timer

你会怎么做?

另一个例子:

包裹名字: com.mycompany.awesomeinhouseframework

groupId:(com.mycompany.awesomeinhouseframework?)

artifactId:(awesome-inhouse-framework?)


1
您在哪里看到groupId和artifactId串联在一起?我认为您陈述的约定是正确的。
Abhinav Sarkar 2010年

2
实际上,java程序包名称中允许使用下划线,请参阅:docs.oracle.com/javase/tutorial/java/package/namingpkgs.html
Adriaan Koster

Answers:


145

您的约定似乎很合理。如果我在Maven仓库中搜索您的框架,我会awesome-inhouse-framework-x.y.jarcom.mycompany.awesomeinhouseframework组目录中寻找。我会根据您的约定在那找到它。

有两个简单的规则适用于我:

  • groupId的反向域软件包(因为它非常独特),并且具有有关Java软件包名称的所有约束
  • 项目名称为artifactId(请记住,它应该是jar名称友好的,即不包含可能对文件名无效或看起来很奇怪的字符)

好的,如果您和abhin4v认为这很正常,那么我就那样做,谢谢!
2010年

我发现非连字符(awesomeinhouseframework)和连字符(awesome-inhouse-framework)的混合拼写有点奇怪。由于groupid不允许使用连字符,因此我也将坚持使用非连字符拼写的人工产物。
MichaelKüller17年

3
请说明“ jar友好名称”是什么意思?
vikramvi

1
在答案中阐明:)。
亨利克·康塞克

241

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

有关groupId,artifactId和版本的命名约定指南

  • groupId将在所有项目中唯一地标识您的项目,因此我们需要实施命名架构。它必须遵循程序包名称规则,这意味着至少必须作为您控制的域名,并且可以根据需要创建任意多个子组。查看有关包名称的更多信息

    例如。org.apache.mavenorg.apache.commons

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

    例如。org.apache.mavenorg.apache.maven.pluginsorg.apache.maven.reporting

  • artifactId是没有版本的罐子的名称。如果创建了它,那么您可以选择任何需要的名称,包括小写字母和没有奇怪的符号。如果是第三方jar,则必须使用该jar的名称。

    例如。mavencommons-math

  • version如果分发它,则可以选择带有数字和点(1.0、1.1、1.0.1,...)的任何典型版本。不要使用日期,因为它们通常与SNAPSHOT(每晚)构建相关联。如果它是第三方工件,则无论使用什么版本,都必须使用其版本号,并且看起来很奇怪。

    例如。2.02.0.11.3.1


4
我知道这些约定,但是它们并没有真正说出工件名称的组成方式(没有JAR命名约定)以及与groupId相同时该怎么做-我还没有看到一个POM在这种情况下。
2010年

@Noarth 1.工件名称由您自行决定(但在名称中使用连字符是常见的做法)。2.您正在寻找一个不存在的绝对“规则”(如果您的内部框架由多个模块组成,那会怎样?)。参见例如Spring,Maven,Hibernate等工件。
Pascal Thivent

不,不,我没有任何模块,只有简单的项目。实际上,我们没有一个名为“ awesome inhouse framework”的项目:)
Noarth 2010年

11
package呢 与groupId有什么区别?
KonstantinK

1
可以在artifactId中添加数字吗?
theonlygusti

100

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

groupId

  • com.companyname.project

artifactId

  • 项目

version

  • 0.0.1

作为出租的工作,我应该使用com.my.company.projectas groupIdcom.client.company.project
Giacomo Alzetta

@GiacomoAlzetta,您可以更好地使用任何适合的套装。一些示例“ com.companyName.hirePortal”或“ org.compnayName.hirePortal”。
Manwal

3
的groupId应com.companyname不com.companyname.project
卡米尔Nekanowicz

1

但是,我不同意groupId,artifactId和版本的命名约定指南的正式定义,该指南建议groupId必须以您控制的反向域名开头。

com表示此项目属于公司,并且org表示此项目属于社会组织。这些都不错,但是对于诸如xxx.tv,xxx.uk,xxx.cn之类的陌生域,以“ tv。”,“ cn。”开头的groupId命名是没有意义的,groupId应该提供基本信息项目而不是领域。


2
该约定阻止开发人员使用Maven,因为在将工件部署到中央Maven存储库之前,您必须拥有一个域。这太荒谬了。拥有一个域可能每年花费不菲。
Tommy.Tang

1
没有要求实际拥有的注册了该域名。唯一的要求是,您的组ID(即Java包名称)在部署时不得与任何其他此类名称冲突。该约定当然不会阻止开发人员使用Maven。
罗勒·布尔克

好的做法是从存储库URL派生包名称。如果您使用的是GitHub,则将调用您的帐户,并调用myuser您的存储库myrepo,然后只需使用包名即可com.github.myuser.myrepo。那是免费的,仍然是独一无二的。
fxnn

-14

考虑一下这以获得一个完全唯一的jar文件:

  • GroupID-com.companyname.project
  • ArtifactId-com-companyname-project
  • 包-com.companyname.project
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.