JDBC 驱动程序 JAR 文件应该驻留在具有数据源的 Tomcat 部署的啥位置?

Posted

技术标签:

【中文标题】JDBC 驱动程序 JAR 文件应该驻留在具有数据源的 Tomcat 部署的啥位置?【英文标题】:Where should the JDBC driver JAR files reside on a Tomcat deployment with a datasource?JDBC 驱动程序 JAR 文件应该驻留在具有数据源的 Tomcat 部署的什么位置? 【发布时间】:2013-09-08 10:08:04 【问题描述】:

我有使用 Spring、Hibernate、Tomcat7 和 mysql 的 java web 应用程序。我使用 Datasource 进行数据库操作。我不太清楚从哪里加载 jar 文件(Tomcat-jdbc.jarMysql-connector.jar)的标准位置是什么?如果我将两个罐子都保存在CATALINA_HOME/lib/webapps/myApp/WEB-INF/lib 中,它会起作用。但是我被告知只使用来自 CATALINA_HOME/lib/ 的 Tomcat-jdbc 和来自 /WEB-INF/lib/mysql-connector.jar,这为 Sql Driver 提供了 ClassNotFound 异常。有人可以告诉我这些罐子的正确位置吗?

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="$db.url" />
        <property name="username" value="$db.username" />
        <property name="password" value="$db.password" />
        <property name="initialSize" value="$db.initialSize" />
        <property name="minIdle" value="$db.minIdle" />
        <property name="maxActive" value="$db.maxActive" />
        <property name="maxIdle" value="$db.maxIdle" />
        <property name="testWhileIdle" value="$db.testWhileIdle" />
        <property name="minEvictableIdleTimeMillis" value="$db.minEvictableIdleTimeMillis" />
        <property name="timeBetweenEvictionRunsMillis" value="$db.timeBetweenEvictionRunsMillis" />
        <property name="validationQuery" value="$db.validationQuery" />
    </bean>

【问题讨论】:

您的类路径中有 MySQL 驱动程序吗? 是的。 /WEB-INF/lib/mysql-connector.jar 另请阅读Apache Tomcat 6.0 Class Loader HOW-TO 【参考方案1】:

这取决于谁在管理数据源。

如果您在自己的 webapp 中手动构建和管理数据源,如 new SomeDataSource() 等,则 JDBC 驱动程序 JAR 文件可以放在 webapp 的 /WEB-INF/lib 中。但是如果 appserver 恰好在它自己的/lib 中已经提供了完全相同的 JDBC 驱动 JAR 文件,那么您也可以直接使用它。

但是,如果您指示 appserver 自己管理数据源,而您只是通过@Resource 等在您的 webapp 中使用它,那么 JDBC 驱动程序 JAR 文件必须放在 appserver 自己的/lib,原因很简单,因为数据源是在 appserver 启动时准备的,完全独立于任何(待)部署的 Web 应用程序。该数据源又可以在所有 web 应用程序之间共享。如果 JDBC 驱动程序 JAR 文件位于尚未部署的 Web 应用之一中,这在技术上将无法正常工作。

【讨论】:

如果每个应用程序使用不同的数据库供应商会怎样? 您可以简单地创建多个数据源。 仅供参考……看到这个detailed helpful answer also by BalusC类似的问题。【参考方案2】:

当谈到要决定罐子的位置时,经验法则是:

    在服务器库位置使用 jar。 如果 jar 不可用,请将其包含在应用程序的 lib 文件夹中。 要找到合适的罐子,系统会按顺序在以下存储库中查找:

JVM 的引导类

系统类加载器类(如上所述)

/WEB-INF/你的web应用的classes /WEB-INF/lib/*.jar的

您的网络应用程序 $CATALINA_HOME/common/classes

$CATALINA_HOME/common/endorsed/*.jar

$CATALINA_HOME/common/i18n/*.jar

$CATALINA_HOME/common/lib/*.jar

$CATALINA_BASE/shared/classes

$CATALINA_BASE/shared/lib/*.jar

【讨论】:

这个答案中的列表在 Tomcat 的更高版本中已经过时了。对于 8.0 版,请参阅 Class Loader HOW-TO 和 this Answer 以了解类似问题。

以上是关于JDBC 驱动程序 JAR 文件应该驻留在具有数据源的 Tomcat 部署的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章

虚拟环境应该驻留在envs文件夹中吗?

API 调用驻留在存储库模式 laravel 应用程序中的啥位置?

oracle监听程序驻留在哪里?

.net Winform 的应用程序的 app.config 文件驻留在哪里......?

是否可以调用驻留在 exe 中的非导出函数?

BizTalk 映射器不显示驻留在其他程序集中的外部数据结构类型的元素