【发布时间】:2014-06-29 15:07:05
【问题描述】:
在 Java Spring 中,我试图将我的数据库设置保留在主应用程序之外,以便可以轻松地在其他服务器上配置它。我将 Tomcat 7 用于生产服务器,并使用 Jetty 服务器(jetty-maven-plugin 版本 8.1.14.v20131031)进行开发。
我遇到的主要问题是我无法使用相同的类 (javax.sql.DataSource) 将工作的 Tomcat 7 配置转换为 Jetty。我从这个类开始,而不是一个更强大的类,所以我从尽可能基本的东西开始。
如果这是两个服务器之间没有直接转换的情况,或者这只是一种不好的做法,我正在寻找一种好的做法或标准。
例如,this answer 是一种替代配置,它使用不同的类,并与 Jetty 一起使用。 (但是它没有回答为什么基本的 DataSource 类适用于 Tomcat 而不是 Jetty。)
我在 server.xml 中有一个 Resource 条目,如下所示:
<Context path="/" docBase="/var/lib/tomcat7/webapps/myapp" reloadable="true">
<Resource name="mysql-dataSource" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/dbname"
username="dbuser"
password="dbuser" />
</Context>
jetty-maven-plugin POM 入口:
...
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.14.v20131031</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
</dependencies>
<configuration>
<!-- <useProvidedScope>?</useProvidedScope> -->
<webApp>
<jettyEnvXml>${basedir}/jetty-env.xml</jettyEnvXml>
</webApp>
</configuration>
</plugin>
...
这在 Tomcat7 中运行良好。
对于 Jetty,我使用的 jetty-env.xml 具有以下配置:
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.eclipse.org/configure.dtd">
<Configure id="Server" class="org.eclipse.jetty.webapp.WebAppContext">
<New id="ds" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>mysql-dataSource</Arg>
<Arg>
<New class="javax.sql.DataSource">
<Set name="driverClassName">com.mysql.jdbc.Driver</Set>
<Set name="url">jdbc:mysql://localhost:3306/dbname</Set>
<Set name="username">dbuser</Set>
<Set name="password">dbuser</Set>
</New>
</Arg>
</New>
</Configure>
我得到这个错误:
java.lang.IllegalStateException: No Constructor: <New class="javax.sql.DataSource">...
【问题讨论】:
-
我已经改写了这个问题,以便它更专注于我真正要问的问题。也就是说,Tomcat 和 Jetty 配置之间的一对一转换。答案表明与使用不同的类(EnvEntry vs Resource,MysqlConnectionPoolDataSource vs DataSource)相同。