Maven 库的最佳实践

Best practice for Maven library

我正在构建一个可以在其他项目中使用的 JPA 库。发布相同内容的最佳方法是什么?我应该发布为包含所有依赖项的 fat jar 还是仅发布 类?

请推荐一个用于构建和发布常用实用程序或库的构建插件

短: 永远不要发布任何东西作为一个胖罐子。您的库应该有一个 pom 文件来声明您的库 compile/runtime 依赖项。发布 JPA 或任何其他库类型之间没有区别。所以只需使用默认的 Maven/Gradle 发布机制

较长的: 您项目的 pom 文件应该列出您的库所需的运行时依赖项,因此当另一个项目将您的 jar 文件作为依赖项包含时,它们会自动获取传递依赖项。 这和胖罐子有一个重要的区别。如果您的库需要 Guava 版本 16,并且您将其包含在另一个已经使用 Guava 版本 20 的项目中,Maven/Gradle 可以让您 select 您想要使用的版本(或者您可以同时拥有这两个版本,但它是个坏主意)。当您开始在您的 jar 中包含其他人的代码时,您就失去了这种可能性,因为您的 fat jar 包含在您构建库时确定的特定版本的第 3 方库。我看到了几个 MethodNotFoundError,因为有人在另一个 jar 中包含了旧版本的库。在开发过程中,这可能会起作用,因为您还有新版本的库,它位于 class 路径的第一个,但在运行时,fat jar 可能位于第一个,而 class 的旧版本遮蔽了较新的版本。

重要的是要了解当 JVM 从文件夹加载 jar 时,例如在 webapp (WEB-INF/lib) 中,您无法控制 classpath 中 jar 文件的顺序,这就是为什么拥有胖罐子或同一个库的多个版本是一个非常糟糕的主意。甚至有可能两台机器以不同的顺序读取相同的文件夹内容,因为默认的排序顺序取决于文件系统。

祝你好运