将第三方库安装到托管Maven存储库的最佳实践?

mat*_*t b 6 java maven-2

假设您有一个使用第三方库的项目,例如Google的Analytics Data API(gdata),它似乎当前没有部署到任何知名或流行的Maven公共存储库/索引中.这不是什么大问题,因为我可以将工件部署到我的本地托管的Nexus存储库中.

但是,Maven社区中是否有任何最佳实践,我应该如何命名这个库在我的POM中的"坐标",因为标准尚未在公共存储库中设置呢?

例如,我应该在我的POM中引用它

<dependency>
    <groupId>com.google</groupId>
    <artifactId>gdata-analytics</artifactId>
    <version>1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

还是有一些更好/更标准的方式让我想出来artifactId

(而且,为什么像谷歌这样的几十家图书馆的提供商不会花费一些精力将它们托管到主流的公共Maven存储库/索引中呢?这不会让人们更容易使用它们从而驱动它们采用?)

Bri*_*ise 3

你所做的事情是相当合理的。几点补充:

  • 当Maven从Nexus获取工件时,该工件被命名为artifactId-version。令人恼火的是,GroupId 被省略了。因此,当工件移动时(例如,复制到 Web 应用程序中的 WEB-INF/lib 中),您的 jar 文件将读取“ gdata-analytics-1.0 ”。这通常不是问题。但是,如果工件名称非常常见,例如“util”,您可能希望在artifactId 中包含组信息,例如使用“ com.google ”的groupId 和“ com.google.gdata-analytics ”的artifactId 。是的,重复很烦人,但它可以使文件系统和搜索更加清晰。我实际上遇到了一个问题,两个不同的 groupId 都有一个“ core-1.0 ” jar,并且在构建时将其复制到 lib 目录中时,一个覆盖了另一个。

  • 我赞同 MattK 的建议,即将 Maven versionId 与该工件众所周知的任何版本保持一致。

  • 如果您遵循 Dominic 的建议,在 groupId 前添加您自己的公司名称(例如 acme),则可能会更轻松地利用 Nexus 的路由功能。它将确保对内部工件的请求不会传播到 Maven Central 并最终出现在它们的日志中(如果您的 groupId 是“ acme.secret.project ”,这可能很重要!