当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

我试图在Ubuntu 12.X下的Tomcat 7中设置JDBC数据源,因此我将以下内容添加到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" />

显然,使用正确且经过测试的数据库用户标识和密码。重新启动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]

我用谷歌搜索,发现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)

任何提示,非常欢迎。

干杯。

最佳办法

来自存储库的库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

次佳办法

原因是在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" />

关键元素是”factory”声明,该声明将覆盖内置默认设置。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9241.html,未经允许,请勿转载。