2015-01-23 2 views
0

среды: Windows 7, JDK1.7, Ггц 3.6.1, базы данных: Postgres 9.3, Grails 2.4.3развертывания Grails с использованием разбега войны бросает исключение

система, кажется, и работает хорошо, когда используется с пробегом -приложение. Когда я использую run-war, он строит файл войны, и во время запуска приложения он генерирует исключение, указанное ниже. (java.lang.NoClassDefFoundError: Не удалось инициализировать класс grails.util.Holders) Когда я посмотрел на buildconfig.groovy и удалил пару записей, которые были добавлены мной для зависимостей файлов jar, которые были необходимы этому приложению. Эти банки разработаны мной и имеют код, специфичный для продукта. После удаления система запускается без каких-либо исключений. Эти банки имеют файлы классов java (не groovy), они разработаны с использованием JDK 1.7. Эти файлы классов используются в приложении (зависит от продукта) База данных postgres добавлена ​​вместо базы данных по умолчанию. Зависимые банки являются частью репо, которое у нас есть в доме. Просто чтобы убедиться, что это не проблема с приложением, я создал образец приложения и попробовал run-war; казалось, что все в порядке. Когда я добавил эти зависимые записи jar в конфигурацию сборки, он начал генерировать исключение. URL репо используется в нарастании конфигурации для зависимых банок

Исключение:

Error | SLF4J: Class path contains multiple SLF4J bindings. 
Error | SLF4J: Found binding in [jar:file:/C:/software/grails-2.4.3/dist/grails-plugin-log4j-2.4.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
Error | SLF4J: Found binding in [jar:file:/C:/<loc>/<applicationName>/target/work/tomcat/webapps/<applicationName>/WEB-INF/lib/grails-plugin-log4j-2.4.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
Error | SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 
Error | SLF4J: Actual binding is of type [org.slf4j.impl.GrailsSlf4jLoggerFactory] 
Error | log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). 
Error | log4j:WARN Please initialize the log4j system properly. 
Error | log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class grails.util.Holders 
Caused by: java.lang.NoClassDefFoundError: Could not initialize class grails.util.Holders 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
Error listenerStart 
Context [/<applicationName>] startup failed due to previous errors 
The web application [/<applicationName>] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
The web application [/<applicationName>] registered the JDBC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 

ответ

0

NoClassDefFoundError обычно утомительно исправить. Его легко путать с ClassNotFoundException, но это совсем другое. Если вы получаете ClassNotFoundException, у вас есть имя класса, которое он пытался загрузить, но не смог найти. Это, как правило, легко исправить - найти банку, которая ее содержит, и добавить к ней зависимость, разрешить ее из репозитория Maven, к которому он был развернут, и вернуться к работе.

Но NoClassDefFoundError происходит, когда класс, который вы пытаетесь загрузить, не может найти класс или ресурс, от которого он зависит. Знание имени класса часто не очень полезно, и это, безусловно, верно здесь. Holders - это класс Grails, который, очевидно, находится в вашем пути к классам. Странно, что все его зависимости, конечно, также находятся в пути к классам, поэтому, вероятно, это несколько банок.

Но поскольку вы вручную добавили банки в каталог lib, скорее всего, вы пропустили зависимость от одного из них. Посмотрите на свой импорт и попытайтесь найти то, чего не хватает. Это может быть что-то тривиальное, что не очень важно для того, что вы пытаетесь сделать. Но если класс, косвенно связанный с ним, не загружается, вам необходимо убедиться, что он есть.

+0

Спасибо за предложение, я попробовал следующее; Я управлял командой «grails dev war», которая создала файл войны, взорвалась одна и та же. Я выполнил команду «grails dependency-report» и вручную проверил, что все необходимые банком банки доступны. Даже банки были косвенно необходимы (банки нужны банкам). Как система Grails может решить одно и то же во время запуска приложения, а не во время войны? – Banu

+0

Проблема решена. Банку, которая нужна приложению, использовалась Spring как зависимость, и это была другая версия. Таким образом, путь класса взял версию Spring из фляги и испортил запуск. – Banu

Смежные вопросы