当使用 Tomcat 作为应用程序服务器设置 Java Web 应用程序时,我经常对库何时可用感到困惑。通过 Stack Overflow 上的一些讨论,我了解到一些库(.jar)文件在运行时可用,而另一些则在编译时可用。我经常会遇到错误,并通过反复试验来解决它们,将 jar 文件放置在不同的目录中,直到应用程序运行或编译。最近有人向我指出,您可以通过 WEB-INF/lib 文件夹在运行时提供 .jar 库。我开始思考这个问题并提出了一些问题。我过去读过这个主题,但没有找到将信息放入我容易理解和保留的上下文中的来源。
-
是否可以为项目设置编译时类路径和运行时类路径?
A。类路径甚至是讨论运行时可用的库的适用术语吗?
WEB-INF/lib 是使库在运行时可用的唯一方法吗? Tomcat 中的 lib 文件夹在运行时可用吗?
这与类加载器有何关系?我知道创建了类加载器的层次结构。这些严格适用于运行时操作吗?
编译类路径是用于编译 Java 源文件的类路径(使用javac -cp ...
,或您的 IDE)。源文件中引用的每个类都必须存在于编译类路径中,否则编译器会抱怨找不到该类。
编译完这些类后,您可以使用它们运行程序(使用java -cp ...
)。显然,源代码直接依赖的库应该位于运行时类路径中。但这还不是全部。如果直接依赖 CoolLibrary.jar,并且该库内部依赖于 Guava.jar,那么 Guava.jar 也必须位于运行时类路径中,尽管编译时不需要它。
网络应用程序有点特殊。 servlet 规范指定用于执行 web 应用程序的类路径由已部署的 web 应用程序的 WEB-INF/classes 目录以及 WEB-INF/lib 中包含的所有 jar 组成。所有 Web 应用程序还可以访问由 Tomcat 直接提供的本机 servlet 和 JSP jar。实际上,Tomcat 的内部类(如 servlet-api 接口的实现类)也可用于 web 应用程序,但依赖这些类并不是一个好主意,因为它将把您的 web 应用程序与 tomcat 绑定在一起。
对于 Web 应用程序来说,谈论运行时类路径有点简单。实际上,每个 webapp 的类都是由 tomcat 的特定类加载器动态加载的。这个 webapp 类加载器是 tomcat 类加载器的子类加载器。因此,理论上,您可以将 Web 应用程序 jar 直接放置在 Tomcat 的类路径中,但这意味着所有 Web 应用程序将共享这些库,并且您在取消部署和重新部署 Web 应用程序时会遇到问题。例如,每个 Web 应用程序拥有特定类加载器的目标是能够在同一个 JVM 中拥有一个依赖于 Guava 11.0 的应用程序和另一个依赖于 Guava 12.0 的应用程序。
有关 tomcat 类加载器的更多信息,请阅读文档 http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)