JAR与WAR文件规范

我注意到WAR文件应该有classes/lib/目录,分别包含它们的类文件根和依赖项。

我还注意到,JAR包含这样的lib/目录并包含它们自己的依赖项并不常见。

所以现在我想知道为什么JAR不应该/通常不包含它们自己的依赖项,但是期望 WAR文件。 除非我遗漏了某些内容,否则它们都要求它们的依赖项在运行时位于类路径上(如果它们缺少依赖项,JAR将不会运行,就像WAR不会运行一样)。 所以对我来说,将依赖项放在WAR文件中的所有参数也适用于JAR。

我在这里“得到”的是什么?!?

从概念的角度来看:
jar通常表示可以使用的单个库,可能有也可能没有依赖。
但是这个想法是可以将特定function作为库中的库提供。

war本身就是一个应用程序,因此它应该包含所有依赖项

WAR文件(主要是WEB应用程序)是未压缩的,lib文件夹中的所有JAR文件在运行时都将位于Web应用程序的类路径中。

JAR文件也可能包含jar文件,但默认的类加载器不会找到并加载它们。

有一些特殊的类加载器可以在jar文件中加载jar文件,但不是标准的。

因为除非您使用可以从嵌套jar(如JarClassLoader )加载类的自定义类加载器,否则无法从嵌套jar加载类。 Servlet和app容器会将war / ear文件中包含的jar添加到其应用程序的类路径中。

它们是具有不同用途的容器。

  • Jar适用于Java类文件和资源,可以是库或直接可运行的应用程序。

  • War是一个包装完整 Web应用程序的容器,包括所有依赖项(例如Jar文件和其他Web资源)。

问题归结为,为什么jar不能包含其他jar 。 我将采取这一设计决策,以便在交换依赖关系时获得最大的灵活性。