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.jar
和Mysql-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 部署的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章
API 调用驻留在存储库模式 laravel 应用程序中的啥位置?