在使用数据源的Tomcat部署中,JDBC驱动程序JAR文件应该放在哪里?

6
我有一个使用Spring、Hibernate、Tomcat7和MySql的Java Web应用程序。我使用数据源进行数据库操作。我不是很清楚从哪个标准位置加载jar文件(Tomcat-jdbc.jar和mysql-connector.jar)?如果我将这两个jar文件都放在CATALINA_HOME/lib/或webapps/myApp/WEB-INF/lib中,它就可以工作。但有人告诉我只使用来自CATALINA_HOME/lib/的Tomcat-jdbc和来自/WEB-INF/lib/的mysql-connector.jar,这会导致Sql Driver的ClassNotFound异常。能否有人告诉我这些jar的正确位置是哪里?
<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驱动程序? - NickJ
是的。/WEB-INF/lib/mysql-connector.jar - PeterGriffin
此外,还可以阅读Apache Tomcat 6.0类加载器 HOW-TO - David Tonhofer
2个回答

9
这取决于谁管理数据源。如果你手动构建和管理数据源,例如new SomeDataSource(),则JDBC驱动程序JAR文件可以放置在Web应用程序的/WEB-INF/lib中。但是,如果应用服务器已经在自己的/lib中提供了相同的JDBC驱动程序JAR文件,则也可以直接使用它。
然而,如果您要求应用服务器完全独立地管理数据源,并且您仅通过@Resource等方式在您的Web应用程序中使用它,则JDBC驱动程序JAR文件必须放置在应用服务器自己的/lib中,原因很简单,因为数据源在应用服务器启动时就已经准备好,完全独立于任何(即将)部署的Web应用程序。此数据源可以在所有Web应用程序之间共享。如果JDBC驱动程序JAR文件位于尚未部署的Web应用程序之一中,则技术上将无法正常工作。

如果每个应用程序使用不同的数据库供应商会怎样? - PeterGriffin
2
您可以简单地创建多个数据源。 - BalusC
FYI...请参考BalusC提供的详细有用的答案,该答案也适用于类似问题。 - Basil Bourque

0

在确定jar文件的位置时,有一个基本规则:

  1. 使用服务器lib目录中的jar文件。
  2. 如果该jar文件不可用,则将其包含在应用程序的lib文件夹中。
  3. 为了找到合适的Jars,系统按以下顺序查找存储库:

JVM的引导类

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

/WEB-INF/classes您的Web应用程序/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,请参见 类加载器 HOW-TO类似问题的此回答 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接