如何将 .war 文件与 JDBC jar 一起部署在 tomcat7 中?
Posted
技术标签:
【中文标题】如何将 .war 文件与 JDBC jar 一起部署在 tomcat7 中?【英文标题】:How to deploy .war file in tomcat7 along with JDBC jar ? 【发布时间】:2017-07-03 04:47:47 【问题描述】:我正在尝试在 tomcat7 中部署一个战争文件。我正在使用 mysql JDBC 驱动程序连接到数据库服务器。 MySQL JDBC驱动的jar文件被复制到$CATALINA_HOME/lib/
目录下,Web应用程序正常工作。
现在,我想在 Amazon Elastic BeanStalk 服务中部署 .war 文件。默认情况下,亚马逊默认情况下不会将 MySQL JDBC 驱动程序放在 $CATALINA_HOME/lib
目录中,我无法运行将 ssh 连接到每个实例并下载目录中的 jar 的脚本。
有什么方法可以捆绑JDBC驱动的jar文件,这样我就不用下载jar文件并将其放在$CATALINA_HOME/lib
目录中了?
【问题讨论】:
如果 Tomcat 什么都不运行,是否可以将 jdbc 驱动程序放入 WAR 文件中? 是的,Tomcat 不运行其他任何东西。我只是在Tomcat中部署一个war文件。 然后在你的war文件中引入驱动。由于您的部署是独立的,因此很可能也会让您的日常工作更轻松。 @ThorbjørnRavnAndersen JDBC 的 jar 文件已经是 war 文件的一部分,并且在 WEB-INF/lib 文件夹中,但我仍然需要将相同的 jar 文件放在 $CATALINA_HOME/lib /文件夹。 您不需要这样做,具体取决于您创建连接的方式。您如何配置和创建连接? 【参考方案1】:您可以将jar文件放在S3存储桶中,然后使用EB container command将文件复制到lib目录,如:
"copy-lib-file":
mode: "000644"
owner: root
group: root
source: https://s3.amazonaws.com/<MY_BUCKET>/<my-JDBC-driver>.jar
【讨论】:
当网络应用程序的负载增加并且弹性 beantalk 使用自动缩放自动创建新实例时,它会起作用吗? 是的,这样做的全部意义在于告诉 Elastic Beanstalk 如何设置它创建的每个新服务器。 非常感谢!将尝试此解决方案 这不起作用,即使将jar文件下载到正确的位置后,我也无法使用JDBC。它给出了与以前相同的错误。虽然文件下载在正确的位置,但我可能需要确保在文件下载后重新启动 tomcat7。【参考方案2】:Tomcat 与许多应用程序服务器一样,安装了各种类加载器(java.lang.ClassLoader 的实现),这些加载器将使您的应用程序能够访问 JDBC jar 资源。
顺序是:
-
引导程序
系统
通用 - $CATALINA_BASE/lib
Webapp - /WEB-INF/lib
将jar放入应用程序内的WEB-INF/lib目录。请注意,此 JAR 将仅对该特定应用程序可见,其他应用程序不可见。
【讨论】:
我已经尝试过了,但它不起作用。 Tomcat7不使用WEB-INF/lib文件夹下的jar 如果 Tomcat 配置为委托类加载,它将首先从 System 和 Common 加载。要优先从 Webapp 加载,请将 delegate 设置为 false。java.sql.SQLException: No suitable driver found
【参考方案3】:
为此,您需要使用 .ebextensions。 使用 .ebextensions,您可以将文件从应用程序包复制到 beanstalk 文件系统。
但是请记住,在 beanstalk 环境中部署的其他应用程序都不会使用您的驱动程序。您的 beanstalk 实例专用于一个应用程序。每次上传应用程序时,您都必须上传 mysql 驱动程序才能部署到 tomcat 安装。
因此,您不会在 tomcat 中的上传大小或内存占用方面获得任何收益(通过 jndi 共享 jdbc 连接池)。
似乎上传包含 jdbc 驱动程序的应用程序(未在您的 maven 配置中提供)是一种更面向 beanstalk 的解决方案。
但是在某些情况下,您不想对打包战争的方式进行任何更改,例如,您的应用程序被部署到包含 jdbc 驱动程序的本地 tomcat 服务器,并且您希望将其上传到弹性 beanstalk环境。 在这种情况下,您也可以考虑docker with elastic beanstalk。
【讨论】:
我只需要在 Elastic beanstalk 上运行一个应用程序,这对我来说不是问题。带有弹性豆茎的 Docker 对我来说也是一个合适的解决方案。感谢您的回答 最不痛苦的解决方案是将 jar 与您的应用程序一起打包。使用 .ebextensions 将是一个痛苦的解决方案(取决于豆茎的经验)。使用 docker 会更痛苦,所以它可能不是一个选择。 是的,但是由于某些奇怪的原因,使用 mysql-connector 将 jar 与 war 文件打包似乎不起作用(尽管它应该可以工作),我不知道为什么。跨度> 我明白了。看来您真正的问题与未包装的罐子有关。不幸的是,最不痛苦的解决方案需要将罐子包装在战争中。用 jar 包装问题制造问题是个好主意。 不行,我已经看到了war文件的内容,mysql-connector jar文件被正确打包到war文件中了【参考方案4】:不,您不能为 Tomcat7 捆绑 JDBC JARS:
我遇到过这个问题,调试起来简直就是一场噩梦。在我的试验和文档中,您不能在 WAR 文件中捆绑 JDBC 驱动程序。或者至少可以,但类加载器会忽略不在 Tomcat Lib 文件夹中的 JDBC 类。它在此处文档的 Mysql 部分的第一段 -> Tomcat7-JDBC 我不知道 Tomcat8 或 Tomcat9 beta...
短期解决方案
我所做的正是你说你不想做的,类似于 Mark B 的解决方案。我使用从 s3 复制它的脚本,但这真的很简单,如果您使用 aws s3 cp 命令,它只有 1 行 bash。 aws s3 工具安装在您的应用程序将在其上运行的 EC2 实例上。
aws s3 cp s3://mybucket/mysql.jar /usr/share/tomcat7/lib/mysql.jar
*你需要重启 tomcat 另一个你应该看到长期解决方案的原因
长期真正的解决方案 = 自动化您的构建步骤
最后,如果您的应用程序变得复杂,您最终将不得不运行配置脚本,这就是我停止使用弹性 beanstalk 并开始使用 AWS cloudformation 的原因,它为您提供了一个“步骤”,您可以在其中输入所有设置脚本类似于 docker 构建步骤。它还将为创建的每个新实例运行这些配置步骤,因此您无需 ssh 到每个盒子上。
Cloudformation 就是将您的基础架构设置转化为代码,您实际上可以将这些代码签入 github 并在没有任何人工干预的情况下进行构建。您只需配置一次构建脚本就头疼,然后将您的环境保存为 json 或 yaml 文件。您可以包含 MySQL 服务器、tomcat 版本、防火墙、负载平衡器等,并从文件中构建所有这些。
【讨论】:
以上是关于如何将 .war 文件与 JDBC jar 一起部署在 tomcat7 中?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Jaspersoft Studio 与 UCanAccess 一起使用?
如何通过 Maven 将 jar 文件添加到 war 文件的 WEB-INF/lib 文件夹? [复制]