Ubuntu Tomcat7 java.lang.ClassNotFoundException:org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory

时间:2013-02-05 16:34:15

标签: tomcat ubuntu jdbc datasource tomcat7

我正在尝试在Ubuntu 12.X下的Tomcat 7中设置JDBC DataSource,所以我在context.xml文件中添加了以下内容:

<Resource name="jdbc/myDS" auth="Container" type="javax.sql.DataSource"
    maxActive="5" maxIdle="2" maxWait="5000"
    driverClassName="org.postgresql.Driver" username="usr" password="***" url="jdbc:postgresql://localhost:5432/db" />

显然,使用正确且经过测试的数据库用户ID和密码。当我重新启动Tomcat时,我收到了这个错误:

Feb 05, 2013 1:10:01 PM org.apache.catalina.core.NamingContextListener addResource
WARNING: Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]

我用google搜索,发现必须将JDBC驱动程序复制到$ CATALINA_HOME / lib文件夹,所以我将postgresql-9.2-1000.jdbc4.jar复制到/ usr / share / tomcat7 / lib,但它没有没有帮助。我尝试将文件复制到其他位置,结果相同。

另一种尝试是将/ usr / share / tomcat7 / lib中的tomcat-dbcp.jar符号链接从../../java/tomcat-dbcp-7.0.30.jar更改为../../java /tomcat-dbcp.jar。唯一的变化是我只得到一个警告而不是四个,但数据源也不起作用。

Java版:

jdoe@sever:~$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.4) (7u9-2.3.4-0ubuntu1.12.10.1)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

任何暗示,非常欢迎。

干杯。

6 个答案:

答案 0 :(得分:35)

来自存储库的库tomcat-dbcp-7.0.30.jar已损坏。

将其替换为:

sudo wget -O /usr/share/java/tomcat-dbcp-7.0.30.jar http://search.maven.org/remotecontent?filepath=org/apache/tomcat/tomcat-dbcp/7.0.30/tomcat-dbcp-7.0.30.jar

答案 1 :(得分:23)

原因是Tomcat7的Ubuntu构建/包过程中的问题。如果我正确理解了这个问题,Apache会从二进制文件构建tomcat-dbcp.jar,而Ubuntu只能从源代码构建软件包。 Ubuntu项目最终需要更改Java包名称,这往往会破坏我们的穷人用户。可以在Ubuntu issues list找到血腥的详细信息。

我找到的解决方案是在定义资源时命名数据源工厂。在一种情况下,我有一个META-INF / context.xml文件,其中包含:

<Resource name="jdbc/myDataSource"
    auth="Container"
    type="javax.sql.DataSource"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/myDatabase"
    username="username" password="password"
    validationQuery="SELECT COUNT(*) FROM MY_TABLE"
    factory="org.apache.commons.dbcp.BasicDataSourceFactory" />

关键元素是“工厂”声明,它会覆盖内置默认值。

在我们的生产机器上,资源在server.xml文件的GlobalNamingResources元素中定义。只在Ubuntu系统上需要指定工厂。

答案 2 :(得分:1)

我在CentOS上遇到了同样的问题。我通过从站点下载一个新的tomcat副本并将tomcat-dbcp.jar上传到我的在线服务器lib,重启服务器来解决这个问题:)

答案 3 :(得分:1)

我在使用Tomcat 7.0.55的Fedora 20上遇到了同样的问题。我在文件路径和文件名中用7.0.55替换了7.0.30,这对我有用。不知道为什么但是这个文件在tomcat 7的YUM安装中完全丢失了。不能使用没有它的数据库。

答案 4 :(得分:0)

这样做了。

确保tomcat-dbcp-7.0.30.jar文件没有以下大小,然后它可能已损坏,您可能需要用上面的sudo wget命令替换它。

-rw-r - r-- 1 root root 235411 2013年5月1日tomcat-dbcp-7.0.30.jar

lrwxrwxrwx 1 root root 22 Jan 10 2013 tomcat-dbcp.jar - &gt; Tomcat的DBCP-7.0.30.jar

答案 5 :(得分:0)

如果您不想打补丁tomcat,也可以(在CentOS上)将以下内容添加到JAVA_OPTS中(例如,将其添加到/usr/share/tomcat/conf/context.xml

JAVA_OPTS="-Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory"