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

我试图在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" /> 

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

我search了一下,发现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的问题列表中可以找到血淋淋的细节。

我找到的解决方案是在定义资源时命名数据源工厂。 在一个案例中,我有一个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系统上才需要指定工厂。

我在CentOS上遇到同样的问题。 我从网站上下载了tomcat的新副本,并将tomcat-dbcp.jar上传到我的在线服务器库中,重新启动服务器:)

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

那样做了。

确保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 – > tomcat-dbcp-7.0.30.jar