Debian 6 上的 Java 类问题:java.lang.NoClassDefFoundError:org/apache/commons/pool/impl/GenericObjectPool

Debian 6 上的 Java 类问题:java.lang.NoClassDefFoundError:org/apache/commons/pool/impl/GenericObjectPool

我在运行一个脚本时遇到了问题,该脚本应该重建通常在 Tomcat 6(普通 Debian 版本)中运行的 Web 服务(Fedora Commons 数字存储库)的数据库。我在 Debian 6 上运行它,虽然 Tomcat 启动正常,但在运行 Tomcat 之前必须调用的重建脚本遇到了以下问题:

ERROR 2010-10-11 13:26:38.836 [main] (Server) Fatal error while starting server
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
 at org.apache.commons.dbcp.BasicDataSource.createConnectionPool(BasicDataSource.java:1492) [na:Nightly-201002202152]
 at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1374) [na:Nightly-201002202152]
 at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) [na:Nightly-201002202152]
 at org.fcrepo.server.storage.ConnectionPool.getConnection(ConnectionPool.java:283) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.SQLUtilityImpl.i_createNonExistingTables(SQLUtilityImpl.java:281) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.SQLUtility.createNonExistingTables(SQLUtility.java:146) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.rebuild.RebuildDOManager.postInitModule(RebuildDOManager.java:130) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.Server.<init>(Server.java:636) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.rebuild.RebuildServer.<init>(RebuildServer.java:43) [fcrepo-server-3.4.jar:na]
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [na:1.6.0_21]
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [na:1.6.0_21]
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [na:1.6.0_21]
 at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [na:1.6.0_21]
 at org.fcrepo.server.utilities.rebuild.RebuildServer.getRebuildInstance(RebuildServer.java:120) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.rebuild.Rebuild.getServer(Rebuild.java:173) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.rebuild.SQLRebuilder.start(SQLRebuilder.java:111) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.rebuild.Rebuild.<init>(Rebuild.java:106) [fcrepo-server-3.4.jar:na]
 at org.fcrepo.server.utilities.rebuild.Rebuild.main(Rebuild.java:394) [fcrepo-server-3.4.jar:na]
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [na:1.6.0_21]
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [na:1.6.0_21]
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [na:1.6.0_21]
 at java.lang.reflect.Method.invoke(Method.java:597) [na:1.6.0_21]
 at org.fcrepo.server.utilities.rebuild.cli.CLILoader.main(CLILoader.java:77) [fcrepo-server-3.4-cli-loader-main.jar:na]

我认为 Tomcat 无法正确连接到 MySQL。

我以 tomcat6 用户身份执行该脚本。我以为这可能是 commons-pool.jar 不在我的 CLASSPATH 中的问题,但我已将几乎所有可能的类路径目录添加到用户的环境变量中:

$ echo $CLASSPATH
/usr/lib/jvm/java-6-sun/lib/dt.jar:/usr/share/tomcat6/lib:/usr/lib/jvm/java-6-sun/lib/tools.jar:/usr/local/fedora/client/lib:/usr/share/java:/usr/share/tomcat6/bin/bootstrap.jar:/usr/share/tomcat6/lib:/var/lib/tomcat6/common/classes:/var/lib/tomcat6/common/lib:/var/lib/tomcat6/lib:/usr/share/java:/usr/local/fedora/server/bin:/usr/local/fedora/client/lib:/usr/local/fedora/server/bin/fcrepo-server-3.4-cli-loader-main.jar:/var/lib/tomcat6/webapps/fedora/WEB-INF/lib:/var/lib/tomcat6/webapps/fedora/WEB-INF/classes

Commons-pool.jar 位于以下路径:

/usr/share/java/commons-pool.jar
/usr/share/tomcat6/lib/commons-pool.jar

mysql-connector-java 也应该在 CLASSPATH 中。我不太清楚出了什么问题。该脚本设置了以下环境:

# ps aux | grep java
tomcat6   3177 32.0  3.1 533992 64608 pts/1    Sl+  13:32   0:01 /usr/lib/jvm/java-6-sun/bin/java -server -Xmn64m -Xms256m -Xmx256m -Djava.endorsed.dirs=/var/lib/tomcat6/common/endorsed:/var/lib/tomcat6/common/lib -Djavax.net.ssl.trustStore=/usr/local/fedora/server/truststore -Djavax.net.ssl.trustStorePassword=tomcat -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl -Dcom.sun.xacml.PolicySchema=/usr/local/fedora/server/xsd/cs-xacml-schema-policy-01.xsd -Dfedora.home=/usr/local/fedora -Dfedora.web.inf.lib=/var/lib/tomcat6/webapps/fedora/WEB-INF/lib org.fcrepo.server.utilities.rebuild.cli.CLILoader org.fcrepo.server.utilities.rebuild.Rebuild

如能得到任何帮助我将非常感激。

答案1

java.lang.NoClassDefFoundError表示类路径中的类的运行时版本是不一样就像在编译时一样。

注意:不是ClassNotFound 错误

您的问题实际上是发现了该类的多个版本。

更新

我应该在 Tomcat 之前指出不是使用系统CLASSPATH。那里设置的值应该被忽略。

http://www.chemaxon.com/jchem/doc/admin/tomcat.html显示您输入的任何内容$CATALINA_HOME/lib都会在启动时自动进入服务器类路径。

shared.loader罐子被orcommon.loader属性拾取/conf/catalina.properties

我读的是

common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar

因此,我认为问题在于您可能还在 Tomcat 构建其类路径的其他位置拥有此类/jar 的副本。

这意味着您部署中的 WEB-INF/classes 和 WEB-INF/lib 下的 JAR 中的所有内容都在 CLASSPATH 中,以及为 Tomcat 6 安装的 lib 中的 JAR。

另请参阅http://www.jarfinder.com/index.php/java/info/org.apache.commons.pool.impl.GenericObjectPool获取包含 GenericObjectPool 类的其他 jar 列表,并删除 commons-pool.jar 以外的 jar

更新 2

是的,您可以删除包含的文件夹,这样 jar 文件就不再位于类路径中了。

但是,我看到您在 classpath 中有这些文件夹,它们是否包含这些 jar 的任何版本?Tomcat 6 将所有内容放在 tomcat6/lib 中,没有 tomcat6/common/lib这是 Tomcat 早期版本的遗留问题。我想知道这些是否被错误地从早期的类路径条目重命名了?

/var/lib/tomcat6/common/classes:
/var/lib/tomcat6/common/lib: 

相关内容