【发布时间】:2017-04-08 05:48:32
【问题描述】:
我正在构建一个可以在其他项目中使用的 JPA 库。发布相同内容的最佳方法是什么?我应该作为包含所有依赖项的胖 jar 发布还是只发布类?
请推荐一个用于构建和发布常用实用程序或库的构建插件
【问题讨论】:
标签: maven build shared-libraries spring-data-jpa
我正在构建一个可以在其他项目中使用的 JPA 库。发布相同内容的最佳方法是什么?我应该作为包含所有依赖项的胖 jar 发布还是只发布类?
请推荐一个用于构建和发布常用实用程序或库的构建插件
【问题讨论】:
标签: maven build shared-libraries spring-data-jpa
短篇: 永远不要将任何东西作为胖罐子发布。你的库应该有一个 pom 文件来声明你的库编译/运行时依赖项。发布 JPA 或任何其他库类型之间没有区别。所以只需使用默认的 Maven/Gradle 发布机制
越长: 您的项目的 pom 文件应该列出您的库所需的运行时依赖项,因此当另一个项目包含您的 jar 文件作为依赖项时,它们会自动获得传递依赖项。 这和一个胖罐子有一个重要的区别。如果您的库需要 Guava 版本 16,并且您将其包含在另一个已经使用版本 20 的 Guava 的项目中,Maven/Gradle 允许您选择要使用的版本(或者您可以同时使用这两个版本,但这是一个坏主意)。当您开始在 jar 中包含其他人的代码时,您会失去这种可能性,因为您的胖 jar 包含在构建库时确定的特定版本的 3rd 方库。我见过几个 MethodNotFoundError 因为有人在另一个 jar 中包含了旧版本的库。在开发过程中,这可能会起作用,因为您还拥有新版本的库,并且它在类路径中是第一个,但在运行时胖 jar 可能是第一个,并且该类的旧版本隐藏了新版本。
了解当 JVM 从文件夹加载 jars 时,例如在 webapp (WEB-INF/lib) 中,您无法控制 jar 文件在类路径中的顺序,这就是为什么使用胖 jars 或同一个库的多个版本是一个非常糟糕的主意。甚至有可能两台机器可以以不同的顺序读取相同的文件夹内容,因为默认的排序顺序取决于文件系统。
祝你好运
【讨论】: