使用 Maven 在具有数据源的嵌入式 Tomcat 上进行部署

Posted

技术标签:

【中文标题】使用 Maven 在具有数据源的嵌入式 Tomcat 上进行部署【英文标题】:Using Maven to Deploy on Embedded Tomcat with a Datasource 【发布时间】:2011-03-18 10:29:58 【问题描述】:

我有一个使用休眠的多模块 maven Web 应用程序。

我使用 tomcat:run 目标是为了在 maven 的嵌入式 tomcat 服务器上运行它。到目前为止一切正常。

但是现在我需要从 hibernate.properties 中的显式 jdbc 配置切换到数据源。我做了以下事情:

更改了 hibernate.properties

来自

hibernate.connection.driver_class=oracle.jdbc.OracleDriver
hibernate.connection.url=jdbc:somejdbcurl
hibernate.connection.username=aUser
hibernate.connection.password=aPassword

hibernate.connection.datasource=java:comp/env/jdbc/datasourcename
在我添加的 web.xml 中
<resource-ref>
    <res-ref-name>jdbc/datasourcename</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
在 web.xml 旁边添加了一个 context.xml,内容如下:
<Context>
  <Resource name="jdbc/datasourcename"
         auth="Container"
         type="javax.sql.DataSource"
         username="aUser" password="aPassword"
         driverClassName="oracle.jdbc.OracleDriver"
         url="jdbc:somejdbcurl"
         maxActive="2" maxIdle="2"/>
</Context>

这不起作用,这是意料之中的,因为我没有找到提供包含 Oracle jdbc 驱动程序的 jar 文件的方法。我期待一个 ClassNotFound Exception 或类似的东西,但我得到了一个

org.hibernate.exception.GenericJDBCException: Cannot open connection

根本原因在堆栈中:

Caused by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

问题是:

为什么 tomcat 不知道我希望它使用 Oracle 驱动程序? 如何告诉tomcat包含驱动的jar文件?

【问题讨论】:

【参考方案1】:

您需要在插件声明中添加 JDBC 驱动程序:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>tomcat-maven-plugin</artifactId>
  <version>1.0</version>
  <configuration>
    ...
  </configuration>
  <dependencies>
    <dependency>
      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>...</version>
    </dependency>
  </dependencies>
</plugin>

顺便说一下,contextFile 的默认值是src/main/webapp/META-INF/context.xml

【讨论】:

看起来很有希望,我明天试试 感谢您指出默认的 contextFile 位置.. 我花了几个小时追着那个 ..

以上是关于使用 Maven 在具有数据源的嵌入式 Tomcat 上进行部署的主要内容,如果未能解决你的问题,请参考以下文章

在 Maven 中使用带有 Flyway 和 jOOQ 的嵌入式数据库进行持续集成

maven scope使用和理解

maven中的嵌入式内存数据库

Nginx+Tomca+Redis实现负载均衡资源分离session共享

使用maven的tomcat:run 部署tomcat

具有嵌入式 init.d 脚本的 Spring Boot 应用程序未在重新启动时启动