2012-03-15 91 views
3

我注意到WAR文件应该分别具有classes/lib/目录来分别包含它们的类文件根目录和依赖关系。JAR vs WAR文件规范

我还注意到,JAR不包含这样一个lib/目录并且包含它们自己的依赖关系。

所以现在我想知道为什么JAR不应该/通常不包含自己的依赖关系,但WAR文件是预计到。除非我错过了某些东西,它们都需要它们的依赖项在运行时位于类路径中(如果它们缺少依赖关系,那么JAR就不会运行,就像WARs不会运行一样)。所以对我来说,将依赖关系放入WAR文件的所有参数也适用于JAR。

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

回答

3

从概念的角度来看:
A jar通常表示可以使用并且可能具有或不具有依赖性的单个库。
但这个想法是可以在jar中提供一个特定的功能作为库。

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

0

它们是具有不同目的的容器。

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

  • War是打包完整的Web应用程序包括所有的依赖关系(如JAR文件和其他网络资源)的容器。

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

+1

那么,关于一个可执行的JAR,就像一个Swing应用程序? – IAmYourFaja 2012-03-15 16:27:57

+0

@AdamTannon,一个'Jar'文件可以直接执行,而'War'不可以 – 2012-03-15 16:29:11

+0

尝试解释为什么,而不仅仅是提供事实... – 2012-03-15 16:31:51

0

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

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

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

0

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