Воспроизвести ошибки 2.1 и Neo4J WrappingNeoServer с помощью Logback.xml
У меня был встроенный сервер neo4j с консолью администратора, работающим в приложении Play 2.0.1. Недавно я обновил кандидат на выпуск совместимости с DeadBolt и обнаружил, что приложение больше не работает.
Чтобы запустить сервер, я делал следующее:
graphDb = (GraphDatabaseAPI) new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder(CONF_DBMETA_LOCATION)
.setConfig(ShellSettings.remote_shell_enabled, "true")
.newGraphDatabase();
ServerConfigurator config;
config = new ServerConfigurator(graphDb);
// let the server endpoint be on a custom port
srv = new WrappingNeoServerBootstrapper(graphDb, config);
srv.start();
К сожалению, я получаю:
> java.lang.RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> '[email protected]' failed to
> initialize. Please see attached cause exception.
Я попытался удалить slf4j и логические зависимости из моего Build.scala, где добавлен neo4j-сервер, но безрезультатно. Кажется, что неправильный logback.xml загружается neo4j. Кроме того, если я добавляю notTransitive() к зависимости neo4j-сервера, предупреждения logback.xml при запуске уходят. Я предполагаю, что специфический log4c.xml neo4j встроен в банку (я) и вызывает проблему. Одно потенциальное решение, которое я вижу, - написать пользовательскую конфигурацию с помощью кода, но я не уверен, как это сделать. Есть предположения? Для справки, я получаю эти ошибки при запуске:
> 22:11:05,124 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
> resource [logback.groovy]
> 22:11:05,125 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
> resource [logback-test.xml]
> 22:11:05,125 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource
> [logback.xml] at
> [jar:file:/Users/steve/Code/play-2.1-RC1/repository/local/play/play_2.10/2.1-RC1/jars/play_2.10.jar!/logback.xml]
> 22:11:05,126 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml]
> occurs multiple times on the classpath.
> 22:11:05,126 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml]
> occurs at
> [jar:file:/Users/steve/Code/play-2.1-RC1/framework/../repository/cache/org.neo4j.app/neo4j-server/jars/neo4j-server-1.9-SNAPSHOT.jar!/logback.xml]
> 22:11:05,126 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml]
> occurs at
> [jar:file:/Users/steve/Code/play-2.1-RC1/repository/local/play/play_2.10/2.1-RC1/jars/play_2.10.jar!/logback.xml]
> 22:11:05,139 |-INFO in [email protected] - URL
> [jar:file:/Users/steve/Code/play-2.1-RC1/repository/local/play/play_2.10/2.1-RC1/jars/play_2.10.jar!/logback.xml]
> is not of type file
> 22:11:05,265 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug
> attribute not set
> 22:11:05,614 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate
> appender of type [ch.qos.logback.core.ConsoleAppender]
> 22:11:05,625 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as
> [STDOUT]
> 22:11:05,657 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming
> default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for
> [encoder] property
> 22:11:05,707 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level
> of ROOT logger to ERROR
> 22:11:05,707 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching
> appender named [STDOUT] to Logger[ROOT]
> 22:11:05,707 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of
> configuration.
> 22:11:05,709 |-INFO in [email protected] - Registering
> current configuration as safe fallback point
Ниже приведено полное исключение:
> play.api.UnexpectedException: Unexpected exception[RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> '[email protected]' failed to
> initialize. Please see attached cause exception.] at
> play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:134)
> ~[play_2.10.jar:2.1-RC1] at
> play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:101)
> ~[play_2.10.jar:2.1-RC1] at scala.Option.map(Option.scala:145)
> ~[scala-library.jar:na] at
> play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:101)
> ~[play_2.10.jar:2.1-RC1] at
> play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:99)
> ~[play_2.10.jar:2.1-RC1] at
> scala.util.Either$RightProjection.flatMap(Either.scala:523)
> [scala-library.jar:na] Caused by: java.lang.RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> '[email protected]' failed to
> initialize. Please see attached cause exception. at
> org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:258)
> ~[neo4j-kernel-1.9.M03.jar:na] at
> org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:88)
> ~[neo4j-kernel-1.9.M03.jar:na] at
> org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:83)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:206)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> EmbeddedGraphDB.initializeDatabase(EmbeddedGraphDB.java:70)
> ~[na:na] at
> EmbeddedGraphDB.<init>(EmbeddedGraphDB.java:51)
> ~[na:na] Caused by: org.neo4j.kernel.lifecycle.LifecycleException:
> Component '[email protected]' failed to
> initialize. Please see attached cause exception. at
> org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:471)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.lifecycle.LifeSupport.init(LifeSupport.java:62)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:96)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:245)
> ~[neo4j-kernel-1.9.M03.jar:na] at
> org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:88)
> ~[neo4j-kernel-1.9.M03.jar:na] at
> org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:83)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] Caused by:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> '[email protected]' was successfully
> initialized, but failed to start. Please see attached cause exception.
> at
> org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:495)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:105)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.logging.LogbackService.init(LogbackService.java:106)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:465)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.lifecycle.LifeSupport.init(LifeSupport.java:62)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] at
> org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:96)
> ~[neo4j-kernel-1.9.M03.jar:1.9.M03] Caused by:
> java.lang.NoSuchMethodError:
> org.codehaus.janino.ClassBodyEvaluator.setImplementedInterfaces([Ljava/lang/Class;)V
> at
> ch.qos.logback.core.joran.conditional.PropertyEvalScriptBuilder.build(PropertyEvalScriptBuilder.java:48)
> ~[logback-core.jar:na] at
> ch.qos.logback.core.joran.conditional.IfAction.begin(IfAction.java:67)
> ~[logback-core.jar:na] at
> ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:276)
> ~[logback-core.jar:na] at
> ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:148)
> ~[logback-core.jar:na] at
> ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:130)
> ~[logback-core.jar:na] at
> ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:50)
> ~[logback-core.jar:na]
EDIT1 Подробнее
Я удалил файл logback.xml из play_2.10.jar и больше не получал дублирующее предупреждение из журнала при запуске приложения воспроизведения.
Затем я попытался найти содержимое как файла neo4j logback.xml, так и play2.1 logback.xml как custom-logback.xml в корне моего игрового проекта. Тот же путь, что и Play.application(). Path() Возможно, это неправильное местоположение для neo4j, чтобы поднять его?
При рассмотрении зависимостей у меня есть один janino, требуемый neo4j-сервером. Кроме того, я не вижу конфликтов в баночках для регистрации, но, возможно, я что-то пропустил. Здесь моя иерархия зависимостей от "зависимостей воспроизведения":
https://gist.github.com/4559389
Я также попытался скопировать конфигурацию по умолчанию, указанную в вики-версии Play2.1, как показано ниже в custom-logback.xml без успеха:
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${application.home}/logs/application.log</file>
<encoder>
<pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern>
</encoder>
</appender>
<logger name="play" level="INFO" />
<logger name="application" level="INFO" />
<root level="ERROR">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
РЕДАКТИРОВАТЬ 2
Определенно кажется, что проблема связана с зависимостью журнала. Neo4j зависит от 0.9.30, и игра зависит от 1.0.7. Я предполагаю, что есть переменная api между этими версиями, когда библиотека загружается? Janino? он не может найти подходящий метод. Все еще не уверены, как правильно указать в logback.xml, чтобы выбрать правильную зависимость во время выполнения.
![Play2.1RC1 Logback Dependency]()
![Neo4j Logback Dependency]()
Графы были сгенерированы графиком зависимости yed + sbt.
Ответы
Ответ 1
Что касается исключения жизненного цикла Neo4j, которое выбрасывается из-за того, что новая версия logback версии 2.1 не совместима с Neo4j. Я столкнулся с этой проблемой и закончил тем, что просто заменил Play logback на более старую совместимую версию, поместив ее в мои зависимости проекта проекта Build.scala:
"ch.qos.logback" % "logback-core" % "1.0.3" force(), // this should override the Play version
"ch.qos.logback" % "logback-classic" % "1.0.3" force(),
Для хорошей меры я также попытался исключить любые переходные зависимости log4j, которые вытягивают, установив параметр SBT ivyXML
:
ivyXML :=
<dependencies>
<exclude module="log4j"/>
</dependencies>
Это, очевидно, хрупкое исправление, но, по крайней мере, для Play 2.1-RC2, похоже, оно работает. У меня все еще есть проблемы, которые фактически настраивают ведение журнала для Neo4j, поэтому я попробую позже обновить этот ответ.
Обновление. Поскольку я новичок в Logback, мне пришлось немного сконфигурировать его с помощью Play/Neo4j. Чтобы предотвратить ошибку Logback и заглушить меня в сообщениях о статусе, мне нужно было поместить файл с именем custom-logback.xml
в мою конфигурационную директорию Play app. Я думаю, что для протокола регистрации Neo4j требуется это. Шахта содержит следующее:
<included>
<logger name="eu.mypackage" level="info">
</logger>
<logger name="org.neo4j" level="warn">
</logger>
<root level="warn">
</root>
</included>
Также в моем каталоге conf мне, казалось, нужен файл с именем logback.properties
, который (в моем случае) содержит только эту строку:
CONSOLE_LEVEL=ERROR
(Эксперты по журналу, не стесняйтесь исправить все это.)
Ответ 2
Кажется, вы сталкиваетесь с двумя отдельными проблемами. Во-первых, Play предоставляет файл logback.xml, который конфликтует с Neo's. Во-вторых, у вас, похоже, есть две версии logback в classpath, которые, как я предполагаю, вызывают исключение NoSuchMethodError. Если вы можете удалить файл Playlogback.xml и поместить этот контент в файл под названием "/custom-logback.xml" (который Neo будет включать через нашу конфигурацию журнала), а затем убедитесь, что у вас есть только одна версия Logback (или в частности, Janino), которые должны помочь.
Ответ 3
В конечном счете я не смог решить проблему зависимости между Play 2.1, Neo4J и logback. Я уверен, что это легко и быстро исправить, но я не уверен, как это сделать, не изменяя явно зависимости от пакета. Вместо этого я решил использовать привязку Neo4J Java REST для замены встроенного сервера. Хорошо работает и имеет только несколько незначительных икота с различиями между собственным API и оберткой REST. Я оставил зависимости для встроенного сервера в Build.scala, а также разделил встроенные и REST-сервисы с общим интерфейсом, чтобы их можно было указывать во время выполнения. Я предполагаю, что в идеале эти оба должны быть плагинами для Play...
Ответ 4
Это может показаться совершенно не связанным с описанием проблемы выше, но:
Проблема для нас - я нахожусь на Mac, мой коллега по Ubuntu, - оказалось, что зависимости библиотек отвлекаются на каталог Play/lib, который не должен был быть там (по какой-либо причине), что в нашем случае была двух версиях Janino - 2.5.10 и 2.6.1, и удаление старой версии разрешило проблему.
Мой коллега упомянул что-то о различиях в соглашениях об именах, используемых для идентификации этих двух выпусков, что могло вызвать проблему.
Итак, в резюме; в некоторых случаях проверьте свой каталог /lib для несущественных или неожиданных библиотек.