我注意到WAR文件应该包含classes/
和lib/
目录,分别包含它们的类文件根目录和依赖项。
我还注意到,JAR包含这样的lib/
目录并包含它们自己的依赖项并不常见。
所以现在我想知道为什么JAR不应该/通常不包含它们自己的依赖项,但是WAR文件期望。除非我遗漏了某些内容,否则它们都要求它们的依赖项在运行时位于类路径上(如果它们缺少依赖项,JAR将不会运行,就像WAR不会运行一样)。所以对我来说,将依赖项放在WAR文件中的所有参数也适用于JAR。
我在这里“没有”到底是什么?!?
答案 0 :(得分:3)
从概念的角度来看:
jar
通常表示可以使用的单个库,可能有也可能没有依赖关系
但我们的想法是,可以在jar
中提供特定功能作为库。
war
本身就是一个应用程序,因此它应该包含所有依赖项
答案 1 :(得分:0)
它们是具有不同目的的容器。
Jar
适用于Java
类文件和资源,可以是库或直接可运行的应用程序。
War
是一个打包完整 Web 应用程序的容器,包括所有依赖项(例如Jar文件和其他Web资源)。
问题归结为,为什么jar
可以包含其他jar
。我将采取这一设计决策,以便在交换依赖关系时获得最大的灵活性。
答案 2 :(得分:0)
WAR文件(主要是WEB应用程序)是未压缩的,lib文件夹中的所有JAR文件在运行时都将位于Web应用程序的类路径中。
JAR文件也可能包含jar文件,但默认的类加载器不会找到并加载它。
有一些特殊的类加载器可以在jar文件中加载jar文件,但不是标准文件。
答案 3 :(得分:0)
因为除非您使用可以从嵌套jar(例如JarClassLoader)加载类的自定义类加载器,否则无法从嵌套jar加载类。 Servlet和app容器会将war / ear文件中包含的jar添加到其应用程序的类路径中。