Maven Artifacts的命名约定

时间:2010-06-30 14:04:46

标签: maven-2 naming-conventions

我们目前正在努力对公司现有项目进行整合。我们已经执行了POC,目前正在记录我们的学习和指导。我为maven工件提出了以下命名约定。请在同一个

上分享您的意见

注意:在我们公司,projectname始终是唯一的

对于单级多模块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

SubParent(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

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

2 个答案:

答案 0 :(得分:18)

IMO您不需要在artifactId中包含org.companyname - 它只是复制了groupId中已存在的信息,从而使工件名称更长且可读性更低。

更新:仅供参考,通过查看项目的依赖关系,我看到了很多类似的例子,例如。

<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是相同的非限定名称,例如:

<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)。

答案 1 :(得分:17)

使用与 artifactId 匹配的 groupId 的非限定名称(例如log4j)是old deprecated practice which is not recommended:它在文件系统级别不好,它会生成“存储库混乱”,它会在浏览存储库时更难找到工件(即使大多数人现在使用搜索引擎)。

建议将您的域名包含在 groupId 中,我肯定不会在 artifactId 中重复(据我所知,Spring is NOT doing that - 除外也许对于OSGI工件?)。

以下是我使用的内容:

家长(pom)

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

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

SubParent(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

这很大程度上受到了文森特·马索尔组织大型建筑的方式的启发,就像他对XWiki或货物一样。