Maven构件的命名约定

22

我们目前正在尝试将公司现有的项目转换为Maven项目。我们已经进行了POC,并正在记录我们的学习和指南。我提出以下Maven构件的命名规则,请分享您对此的看法。

注意:在我们的公司中,项目名称始终是唯一的。

单层多模块Maven项目

父级(pom)

  • groupId: org.companyname.projectname
  • artifactId: org.companyname.projectname
  • version: x.x.x

例如: org.companyname.projectname:org.companyname.projectname-1.0.0.pom

模块 (jar)

  • groupId: org.companyname.projectname
  • artifactId: org.companyname.projectname.modulename
  • version: x.x.x

例如: org.companyname.projectname:org.companyname.projectname.modulename-1.0.0.jar

多层多模块Maven项目

父级 (pom)

  • groupId: org.companyname.projectname
  • artifactId: org.companyname.projectname
  • version: x.x.x

例如: org.companyname.projectname:org.companyname.projectname-1.0.0.pom

子父级 (pom)

  • groupId: org.companyname.projectname
  • artifactId: org.companyname.projectname.subcategory
  • version: x.x.x

例如: org.companyname.projectname:org.companyname.projectname.subcategory-1.0.0.pom

模块 (jar)

  • groupId: org.companyname.projectname
  • artifactId: org.companyname.projectname.subcategory.modulename
  • version: x.x.x

请注意,上述HTML标记已被保留。

例子:org.companyname.projectname:org.companyname.projectname.subcategory.modulename-1.0.0.jar

该字符串是一个 Maven 依赖项的标识符,表示一个名为“modulename”的模块,它属于“projectname.subcategory”子类别,该子类别又属于“companyname”公司的“projectname”项目。 版本号为1.0.0,文件类型为 jar。

2个回答

20

我认为你不需要在artifactId中包含org.companyname - 这只是重复了groupId中已经存在的信息,使得artifact名称变得更长和更难读。

更新: FYI,浏览我们项目的依赖项时,我看到有很多类似的例子,例如:

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>

<groupId>org.codehaus.mojo</groupId>
<artifactId>jboss-maven-plugin</artifactId>

<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j-fop-ext-0.20.5-complete</artifactId>

<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>

<groupId>opensymphony</groupId>
<artifactId>oscache</artifactId>

<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-libs</artifactId>

<groupId>javax.resource</groupId>
<artifactId>connector-api</artifactId>

<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>

<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>

还有很多情况,其中组ID和构件ID具有相同的未限定名称,例如:

<groupId>log4j</groupId>
<artifactId>log4j</artifactId>

<groupId>velocity</groupId>
<artifactId>velocity</artifactId>

<groupId>fop</groupId>
<artifactId>fop</artifactId>

<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>

但我还没有看到任何一个具有完全限定的组ID和相同的工件ID(例如,对于Log4J将是org.apache.log4j:org.apache.log4j)。


谢谢Péter。这很有道理,但我正在查看来自Spring和Maven仓库的工件。它们都遵循相似的命名约定,所以我也决定效仿大众 ;-) - Manoj
@Manoj,我看到的ID样本似乎与你看到的不同-请看我的更新(当然,你自己决定吧 :-)) - Péter Török
3
官方Maven指南认同Peter的命名规范 :-) http://maven.apache.org/guides/mini/guide-naming-conventions.html - Manoj

16
使用未经过资格认证的名称来匹配artifactId的groupId(例如log4j)是一个不推荐的已过时的做法:它在文件系统层面上表现糟糕,生成"存储库混乱",使得浏览存储库中的项目更加困难(即使大多数人现在都使用搜索引擎)。建议的做法是在groupId中包含您的域名,我当然不会在artifactId中重复它(据我所知,Spring没有这样做 - 除了OSGI artifacts?)。
以下是我使用的内容:
父级(pom)
- groupId: org.companyname.projectname - artifactId: root - version: x.x.x
例如:org.companyname.projectname:root-1.0.0.pom
子父级(pom)
- groupId: org.companyname.projectname - artifactId: subcategory-parent - version: x.x.x
例如:org.companyname.projectname:subcategory-parent-1.0.0.pom
模块(jar)
  • groupId:org.companyname.projectname
  • artifactId:modulename
  • version:x.x.x

例如:org.companyname.projectname:modulename-1.0.0.jar

我还使用惯例来为<description>元素提供干净的概述,以便在反应堆构建期间进行查看。以下是宠物项目的示例:

$ mvn compile
[INFO] Scanning for projects...
[INFO] Reactor build order: 
[INFO]   Personal Sandbox - Samples - Parent POM
[INFO]   Personal Sandbox - Samples - EJB3 and Cargo Sample
[INFO]   Personal Sandbox - Tools - Parent POM
[INFO]   Personal Sandbox - Tools - Shared Verification Resources
[INFO]   Personal Sandbox - Samples - EJB3 and Cargo Sample - Services
[INFO]   Personal Sandbox - Samples - EJB3 and Cargo Sample - Functests
[INFO]   Sandbox Externals POM

这受到Vincent Massol的启发,他用XWiki或Cargo组织大型构建的方式。


如果我为每个子模块更改groupId,这样做不会有什么问题吧? - WelcomeTo
生成_Reactor建筑顺序_的输出应该是<name>而不是<description> - timomeinen

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