代码之家  ›  专栏  ›  技术社区  ›  matt b

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

  •  6
  • matt b  · 技术社区  · 15 年前

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

    但是,在Maven社区中,有没有什么最佳实践可以让我在POM中命名这个库的“坐标”,因为公共存储库中还没有为它设置标准?

    例如,我应该在POM中把它称为

    <dependency>
        <groupId>com.google</groupId>
        <artifactId>gdata-analytics</artifactId>
        <version>1.0</version>
    </dependency>
    

    还是有更好/更标准的方法让我想出 artifactId ?

    (而且,为什么像Google这样的几十个图书馆的提供者不花点力气把它们托管到主流的公共Maven存储库/索引中呢?这是否会使人们更容易使用它们,从而推动采用?)

    5 回复  |  直到 15 年前
        1
  •  3
  •   Brian Laframboise    15 年前

    你所做的一切都很合理。另外几点:

    • 当maven从nexus获得一个工件时,该工件被命名为artifactid version。groupid被省略了。因此,当工件移动时(比如,在Web应用程序中复制到WEB-INF/lib中),JAR文件将读取“ 数据分析-1.0 “。这通常不是问题。但是,如果工件名称非常常见,例如“util”,则可能需要在工件ID中包含组信息,例如使用的groupid 谷歌公司 “和工件ID” com.google.gdata-analytics网站 “。是的,重复是令人讨厌的,但它在文件系统和搜索中产生最大的清晰度。实际上我遇到了一个问题,两个不同的groupid都有一个“ CORE-1.0 “jar,一个在构建时复制到lib目录时覆盖另一个。

    • 我赞同Mattk的建议,即将Maven版本ID与工件通常已知的任何版本相匹配。

    • 如果您遵循Dominic的建议,用您自己的公司名称(例如acme)前缀groupid,那么利用nexus的路由功能可能会更容易。它将确保对内部构件的请求不会传播到maven central,并最终出现在它们的日志中(如果您的groupid是,这可能很重要。” acme.secret.项目 “!

        2
  •  3
  •   MattK    15 年前

    我使用Maven已经一年了,从未遇到过“标准”命名约定。我通常完全按照您所做的做,尽管我尽量使版本号接近“真实”版本号,以避免在部署多个版本时混淆。

        3
  •  2
  •   Dominic Mitchell    15 年前

    我倾向于在groupid前面加上自己常用的groupid。这就清楚地表明,这是我上传的东西,以防万一它泄露给全世界。

        4
  •  0
  •   TimP    15 年前

    许多sourceforge项目在groupid中使用项目的名称,例如:

    groupid net.sf.json-lib 工件ID JSON LIB

    这在Google示例中可能是合适的,因为有很多Google工件。

    记住,您可以使用分类器标记来区分两个jar 在同一版本中,但为不同的目的而构建,例如不同的JVM。

        5
  •  0
  •   Grimarr    15 年前

    你可能走运了:谷歌有自己的Maven回购项目。请参阅本页: Instructions

    我有一些JAR文件是不合适的,所以我必须在每个工作站上加载它们(我们还没有公司共享的repo)。我将它们放在a/lib目录的源代码树中(并不总是一个好主意),并添加了一个小的.bat文件(或.sh脚本),其中包含MVN安装文件命令,以便在第一次构建时加载本地计算机的repo。如果必须更新这些jar,我也会更新“load.bat”文件,然后重新运行它。在我的情况下,我不希望这种情况一年发生一次以上,也许更少。