【问题标题】:Tomcat loading JDBC connector jar from {$catalina_home}/(app instance)/lib but not if in project pomTomcat 从 {$catalina_home}/(app instance)/lib 加载 JDBC 连接器 jar,但如果在项目 pom 中则不加载
【发布时间】:2015-06-24 13:23:06
【问题描述】:

我使用的是 Tomcat 7.0.53

我有一个应用程序需要为它的 JDBC 连接加载 mysql-connector-java-5.0.8.jar。如果我将连接器 jar 放在 {$catalina_home}/(app instance)/lib/ 目录中,一切正常。如果我使用 maven 将 jar 导入到我的战争中,或者将 jar 放在 {$catalina_home/lib/ 中,那么它将不会加载。

我有一个相当典型的战争设置,导入的 jar(s) 放在 /WEB-INF/lib/ 目录中。然而,与我通常从事的项目有一个不同之处。不同数据源的上下文文件作为显式文件位于 webapp/{app}/META-INF/context.xml 中。

理想情况下,我想使用 maven 将连接器 jar 放入我的战争中,所以如果有人能告诉我: 1. 为什么会这样? 2. 一个可能的修复,以便可以通过 maven 导入连接器 jar?

不胜感激。

【问题讨论】:

  • 你的战争中罐子的结局是什么(你的战争的结构是什么)?查看您的 pom.xml 可能会有所帮助。
  • jar 最终位于 /web-inf/lib/ 目录中。
  • 放到$TOMCAT_HOME/lib目录下,见:stackoverflow.com/questions/6981564/…
  • 我已经尝试过了,但它不会从那里为我的应用程序加载。仅来自应用程序实例 lib 目录。

标签: java tomcat maven-3


【解决方案1】:

当您让 Tomcat 管理您的 DataSource 并通过 JNDI 使其可用时,它使用自己的类加载器进行初始化,而不是用于 webapp 本身的类加载器。这意味着为了初始化 DataSource,所有需要的类都必须在 Tomcat 的类路径中(例如,在其 lib 目录中)。

Tomcat 这样做是为了将容器与潜在的错误或恶意 Web 应用程序隔离开,并促进加载和卸载 Web 应用程序的能力。

【讨论】:

  • 但这是否意味着我必须将连接器 jar 放在 TOMCAT_HOME/lib 目录中?我已经尝试过了,但它没有从那个位置正确加载。
【解决方案2】:

解决方案分为两部分。

  1. 我的部分上下文文件填充了位于 catalina.properties 上的属性。由于 catalina.properties 使用实例类加载器加载,因此必须将连接器 jar 加载到相同的类路径中才能看到。这就是为什么我不能将连接器 jar 放入 TOMCAT_HOME/lib/

  2. 在我的上下文中,我调用的是 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>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 2011-05-26
    • 2010-12-01
    • 2015-09-17
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多