Tomcat 从 {$catalina_home}/(app instance)/lib 加载 JDBC connector jar 但如果在项目 pom 中则不会
Tomcat loading JDBC connector jar from {$catalina_home}/(app instance)/lib but not if in project pom
我正在使用 Tomcat 7.0.53
我有一个应用程序需要加载 mysql-connector-java-5.0.8.jar 因为它是 JDBC 连接。如果我将连接器 jar 放在 {$catalina_home}/(app instance)/lib/ 目录中,一切都可以正常加载。如果我使用 maven 将 jar 导入到我的 war 或将 jar 放在 {$catalina_home/lib/ 然后它不会加载。
我有一个相当典型的 war 设置,导入的 jar(s) 放在 /WEB-INF/lib/ 目录中。然而,与我通常从事的项目有一点不同。不同数据源的上下文文件作为显式文件位于 webapp/{app}/META-INF/context.xml.
理想情况下,我想使用 Maven 将连接器 jar 放入我的 war 中,所以如果有人能告诉我:
1. 为什么会这样?
2. 一个可能的修复,以便连接器 jar 可以通过 maven 导入?
将不胜感激。
当您 Tomcat 管理您的数据源并通过 JNDI 提供时,它使用自己的 class 加载器来进行初始化,而不是用于的 class 加载器网络应用程序本身。这意味着为了初始化数据源,所有需要的 classes 必须在 Tomcat 的 class 路径中(例如,在它的 lib 目录中)。
Tomcat 这样做是为了将容器与潜在的错误或恶意网络应用程序隔离开来,并促进加载和卸载网络应用程序的能力。
解决方案分为两部分。
我的部分上下文文件填充了位于 catalina.properties 的属性。由于 catalina.properties 使用实例类加载器加载,连接器 jar 必须加载到相同的类路径才能看到。这就是为什么我不能把连接器罐子放在 TOMCAT_HOME/lib/
在我的上下文中,我调用了 tomcat 工厂,factory="org.apache.tomcat.jdbc.pool.DataSourceFactory",我没有在我的应用程序中使用连接器 jar 加载该工厂所需的依赖项依赖。添加以下依赖项后,问题就解决了。
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.24</version>
</dependency>
我正在使用 Tomcat 7.0.53
我有一个应用程序需要加载 mysql-connector-java-5.0.8.jar 因为它是 JDBC 连接。如果我将连接器 jar 放在 {$catalina_home}/(app instance)/lib/ 目录中,一切都可以正常加载。如果我使用 maven 将 jar 导入到我的 war 或将 jar 放在 {$catalina_home/lib/ 然后它不会加载。
我有一个相当典型的 war 设置,导入的 jar(s) 放在 /WEB-INF/lib/ 目录中。然而,与我通常从事的项目有一点不同。不同数据源的上下文文件作为显式文件位于 webapp/{app}/META-INF/context.xml.
理想情况下,我想使用 Maven 将连接器 jar 放入我的 war 中,所以如果有人能告诉我: 1. 为什么会这样? 2. 一个可能的修复,以便连接器 jar 可以通过 maven 导入?
将不胜感激。
当您 Tomcat 管理您的数据源并通过 JNDI 提供时,它使用自己的 class 加载器来进行初始化,而不是用于的 class 加载器网络应用程序本身。这意味着为了初始化数据源,所有需要的 classes 必须在 Tomcat 的 class 路径中(例如,在它的 lib 目录中)。
Tomcat 这样做是为了将容器与潜在的错误或恶意网络应用程序隔离开来,并促进加载和卸载网络应用程序的能力。
解决方案分为两部分。
我的部分上下文文件填充了位于 catalina.properties 的属性。由于 catalina.properties 使用实例类加载器加载,连接器 jar 必须加载到相同的类路径才能看到。这就是为什么我不能把连接器罐子放在 TOMCAT_HOME/lib/
在我的上下文中,我调用了 tomcat 工厂,factory="org.apache.tomcat.jdbc.pool.DataSourceFactory",我没有在我的应用程序中使用连接器 jar 加载该工厂所需的依赖项依赖。添加以下依赖项后,问题就解决了。
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> <version>8.0.20</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.24</version> </dependency>