如何在tomcat7中部署.war文件和JDBC jar?

时间:2017-02-14 18:44:17

标签: java amazon-web-services tomcat jdbc elastic-beanstalk

我正在尝试在tomcat7中部署war文件。我使用MySQL JDBC驱动程序连接到数据库服务器。 MySQL JDBC驱动程序的jar文件被复制到$CATALINA_HOME/lib/目录,Web应用程序正常工作。

现在,我想在Amazon Elastic BeanStalk服务中部署.war文件。默认情况下,默认情况下,亚马逊并没有将MySQL JDBC驱动程序放在$CATALINA_HOME/lib目录中,我无法运行一个脚本,该脚本将ssh到每个实例中并在目录中下载jar。

有没有办法,我可以将jar文件捆绑为JDBC驱动程序,这样我就不必下载并将jar文件放在$CATALINA_HOME/lib目录中了?

4 个答案:

答案 0 :(得分:2)

您可以将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

答案 1 :(得分:1)

Tomcat与许多应用程序服务器一样,安装了各种类加载器(java.lang.ClassLoader的实现),它将使您的应用程序可以访问JDBC jar资源。

订单是:

  1. 自举
  2. 系统
  3. Common - $ CATALINA_BASE / lib
  4. Webapp - / WEB-INF / lib
  5. 将jar放入应用程序内的 WEB-INF / lib 目录中。请注意,此JAR仅对此特定应用程序可见,而不会显示其他应用程序。

答案 2 :(得分:1)

为此,您需要使用。ebextensions。 使用.ebextensions,您可以将文件从应用程序包复制到beanstalk文件系统。

但请记住,在beanstalk环境中部署的其他应用程序都不会使用您的驱动程序。您的beanstalk实例专用于一个应用程序。每次上传应用程序时都必须上传mysql驱动程序才能部署到tomcat安装。

因此,在tomcat(通过jndi共享jdbc连接池)中,您在上传大小或内存占用方面没有任何收获。

似乎上传包含jdbc驱动程序的应用程序(maven配置中未提供)是面向beanstalk的解决方案。

但是,有些情况下您不希望对战争打包的方式进行任何更改,例如您的应用程序部署到包含jdbc驱动程序的内部tomcat服务器,并且您希望将其上载到弹性豆茎环境。 在这种情况下,您也可以考虑docker with elastic beanstalk作为选项。

答案 3 :(得分:1)

不,你不能为Tomcat7捆绑JDBC JARS:

我遇到过这个问题,这是调试的噩梦。在我的试验和文档中,您无法将WAR驱动程序中的JDBC驱动程序捆绑在一起。或者至少你可以,但类加载器将忽略不在Tomcat Lib文件夹中的JDBC类。它在这里文档的Mysql部分的第一段 - &gt; Tomcat7-JDBC我不知道Tomcat8或Tomcat9 beta ...

短期解决方案

我所做的正是你所说的你不想做的,与Mark B的解决方案类似。我使用一个脚本从s3复制它但这很简单,如果你使用aws s3 cp命令只有一行bash。 aws s3工具安装在运行应用程序的EC2实例上。

aws s3 cp s3://mybucket/mysql.jar /usr/share/tomcat7/lib/mysql.jar

*您需要重新启动tomcat,这是您应该看到长期解决方案的另一个原因

长期真实解决方案=自动构建步骤

最后,如果您的应用程序变得复杂,您最终将不得不运行配置脚本,这就是为什么我停止使用弹性beanstalk并开始使用AWS cloudformation,它为您提供了一个“STEP”,您可以在其中输入所有设置脚本类似于docker构建步骤。它还将为每个创建的新实例运行这些配置步骤,因此您无需在每个框上进行ssh。

Cloudformation就是将您的基础架构设置转换为代码,您无需任何人工干预即可将其实际检入github并构建。您经历了一次配置构建脚本的麻烦,然后将您的环境保存为json或yaml文件。您可以包含MySQL服务器,tomcat版本,防火墙,负载平衡器等,并从文件中构建所有内容。