最近向优锐课老师请教了“如何将JAR文件部署到Tomcat”的问题,接下来我将自己受到的启发,整理记录成这篇文章,或许也能够对你有帮助。
Java学习资料交流qq群:907135806,在接下来的学习如果过程中有任何疑问,欢迎进群探讨。
Apache Tomcat是运行Java Web应用程序的servlet引擎,这些Java Web应用程序打包为Web应用程序存档文件或WAR。WAR文件是已部署到Tomcat的文件,而不是JAR文件。但是,尽管事实上如何部署JAR并不是一个常见问题,但值得进一步探讨。
将WAR文件部署到Tomcat
关于如何将WAR文件部署到Tomcat,如果这是你需要解决的实际问题,建议你可以看看我的上篇文章:
将WAR文件部署到Tomcat的5种方法
但是,这并不是说JAR文件与在Tomcat上运行的应用程序之间完全没有关系。诸如Spring和Hibernate之类的框架都打包在JAR文件中,一个团队可能放在一起的通用实用程序也打包为JAR。在运行时,Apache Tomcat服务器上托管的Web应用程序需要可以访问这些文件。
我有一个暗示,当开发人员询问如何将JAR文件部署到Tomcat时,他们实际上是在询问应将JAR文件放在何处,以确保它们在运行时属于Apache Tomcat类路径,并且随后可供其部署的应用程序访问。毕竟,没有什么比部署应用程序并遇到大量Tomcat的ClassNotFoundExceptions更糟糕的了。
JAR文件和Tomcat
放置JAR文件以使其内容在运行时可用于Java Web应用程序的正确位置是该应用程序打包在其中的WAR文件的WEB-INF\lib目录中。除了极少数例外,Java Web应用程序在运行时必须链接到的JAR文件应打包在WAR文件本身中。这种方法有助于减少Web应用程序具有的外部依赖项的数量,同时消除了类加载器冲突的可能性。
有时,某些通用工具非常普遍,例如一组JDBC驱动程序,因此将它们直接放置在Tomcat子文件夹中而不是将它们实际打包在WAR中更为有意义。
如果托管在Tomcat服务器上的每个应用程序都使用MySQL数据库,则将MySQL数据库驱动程序放置在Tomcat的\lib目录中,而不是WAR的WEB-INF\lib目录中。此外,如果你具有已升级的数据库,但是需要升级JDBC驱动程序,则通过在该共享位置上更新JAR文件,这将意味着所有应用程序将同时开始使用同一组更新的Java库。
Web应用程序的WEB-INF\lib文件夹和Tomcat\lib目录是在Tomcat中部署JAR文件的最佳位置。
常见的组织错误是将包含JSF或Spring Boot之类的框架的JAR文件放在Tomcat的\ lib目录中。人们认为,由于组织中部署到Tomcat的每个应用程序都是使用Spring或JSF构建的,因此将这些JAR文件放入Tomcat的\ lib文件夹是有意义的。
尽管这最初可能会起作用,但是只要一个应用程序需要使用JAR的更新版本,就会出现问题。如果共享的JAR文件已更新为新版本,则使用该JAR文件的Tomcat服务器上托管的所有应用程序也必须更新。显然,这会造成不必要的工作和不必要的风险,因为即使不需要使用更新版本的应用程序也必须经过回归测试。相反,如果将所需的JAR文件打包在WAR文件本身中,则可以避免大规模迁移问题。
部署到Tomcat lib目录的JAR
Tomcat\lib目录的一个问题是它包含应用程序服务器实现Servlet和JSP API所需的所有标准库。开箱即用,该文件夹充满了运行时所需的30多个JAR文件。另外,你不想弄乱任何必需的JAR文件,因为如果删除或干扰了其中任何文件,则Tomcat服务器将无法启动。
一些Tomcat管理员喜欢使用应用程序JAR文件的单独目录来解决此问题。管理员只需对Tomcat的catalina.properties文件中的common.loader属性进行简单的编辑即可。例如,要使Tomcat链接到名为\applib的子目录中的JAR文件,可以对common.loader属性进行以下更改:
#Note that catalina.base refers to the Tomcat installation directory
common.loader="${catalina.base}/lib","${catalina.base}/applib/*"
应该注意的是,由于Tomcat在Java安装上运行,因此它也可以访问放置在JVM的类路径上的任何JAR文件。这被称为系统类路径,尽管它对于需要由Tomcat链接的JAR文件是一个可行的选择,但我不建议你使用系统类路径。
该位置仅应用于用于引导JVM的资源,或仅在运行时由JVM直接引用的资源。此外,系统类路径通常受到严格限制,因此软件开发人员或任何持续集成工具不太可能具有读取或写入此文件夹所需的凭据。
Tomcat JAR部署选项
总而言之,我认为当你问如何将JAR文件部署到Tomcat时,你真的在想如何使运行时Web应用程序可以使用JAR文件。有三种建议的选项可以实现此目的:
- 将JAR文件打包到Java Web应用程序的WEB-INF \lib文件夹中;
- 将JAR文件放在Apache Tomcat安装的\ lib子文件夹中;
- 通过在catalina.properties文件中编辑Tomcat的common.loader属性,为共享的JAR文件配置一个文件夹。
如果你遵循此建议,则与Tomcat有关的JAR文件部署问题应该会消失,并且日志中的ClassNotFoundExceptions将成为过去。
感谢阅读!如果需要更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java学习资料和视频课程的童鞋可以添加vx:ddmsiqi 获取!