为什么 Jar 的依赖项没有在其清单中列出

Why aren't the Dependencies of a Jar listed in its Manifest

在我看来,将 jar 的依赖项列在其清单中(可能作为可选字段)真的很有用。如果没有此功能,则几乎不可能知道 jar 依赖于什么,除非在网络上的某个地方找到它,或者使用依赖性管理工具,或者类似的东西。现在每个人都在使用整个工件 ID、组 ID、版本约定,我想这将大大简化设置项目所需的工具。

我发现自己比我想要的更多地需要使用 maven,因为弄清楚某些东西是否需要 Apache commons 或日志记录或任​​何情况是一件很麻烦的事情,为什么不把 jars 列在一些 Manifest 中字段?

我觉得maven比较方便。在清单中列出依赖项是非常模糊的,您不指定诸如组、位置或存储库之类的元素,即使您对依赖项的名称没有安全性。

可以在清单中描述依赖项,但如何引用此依赖项?这取决于每个开发人员,因此可能导致使用不同的名称、不同的 jar 包装等。

Maven 更复杂但也更合适,因为它定义了存储库、组、工件、版本和 packagins,最终有助于减少歧义并允许您依赖可信赖的系统。

当使用 maven 时,一个 pom 副本存储在 META-INF 目录中,您可以在这里找到依赖项。这比在清单中列出依赖项更有用。

看看 OSGI (http://www.osgi.org/Main/HomePage)。 它提供了 jar 上包(导入和导出语句)的依赖信息。

总的来说: 依赖关系通常并不简单直接(它们可能在范围、版本等方面有所不同)。 来自 JEE 的 EAR 和 WAR 规范尝试了类似的应用程序服务器。

因为依赖管理比乍看起来更难,所以Java 没有提供机制。

如果要列出依赖项,则需要某种格式来描述每个依赖项。那必须是一个名称加上一个版本选择器。

Java是跨平台的,所以名字不能是文件名,因为文件名不可移植。它不能是 JAR 的 "name",因为某些实现可能分布在多个 JAR 中。名称必须是唯一的。谁能保证?

JAR 可能通过抽象 API 访问服务,因此可能需要 require an 实现,但不需要 specific 执行。怎么表达呢?

一个 JAR 可能与另一个 JAR 的多个版本一起工作。怎么表达呢?您如何表明它适用于一系列版本?版本 ID 很少是数字,因此没有明显的顺序。