У меня проблемы с запуском сценария, который должен перестроить базу данных для веб-службы (цифровой репозиторий Fedora Commons), который обычно работает внутри Tomcat 6 (стандартная версия Debian). Я запускаю его на 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
Буду благодарен за любую помощь.
java.lang.NoClassDefFoundError
означает, что версия среды выполнения класса в пути к классам не то же самое как это во время компиляции.
Примечание: это не ClassNotFound
На самом деле ваша проблема заключается в обнаружении нескольких версий класса.
Обновить
Я должен был указать, прежде чем Tomcat сделает не использовать систему CLASSPATH
. Установленные здесь значения следует игнорировать.
http://www.chemaxon.com/jchem/doc/admin/tomcat.html показывает все, что вы вкладываете в $CATALINA_HOME/lib
автоматически попадает в путь к классам сервера во время запуска.
Банки забирает shared.loader
или common.loader
собственностью /conf/catalina.properties
Мой читает
common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar
Поэтому я думаю, проблема в том, что у вас также может быть копия этого класса / jar в некоторых других местах, из которых Tomcat строит его путь к классам.
Все, что есть в WEB-INF / classes и в JAR в WEB-INF / lib в вашем развертывании, находится в CLASSPATH вместе с JAR, которые установлены в lib для Tomcat 6.
Также см http://www.jarfinder.com/index.php/java/info/org.apache.commons.pool.impl.GenericObjectPool для списка других jar-файлов, содержащих класс GenericObjectPool, и удалите другие, кроме commons-pool.jar
Обновление 2
Да, вы можете удалить содержащую папку, и jar-файлы больше не будут в пути к классам.
Однако я вижу, что у вас есть эти папки в пути к классам, содержат ли они какие-либо версии этих jar-файлов? Tomcat 6 помещает все в tomcat6 / lib, нет tomcat6 / common / lib который является пережитком более ранних версий Tomcat. Интересно, были ли они неправильно переименованы из более ранней записи пути к классам?
/var/lib/tomcat6/common/classes:
/var/lib/tomcat6/common/lib: