2013-01-17 7 views
10

Ich hatte einen eingebetteten neo4j Server mit Admin-Konsole innerhalb einer Play 2.0.1-Anwendung arbeiten. Ich habe vor kurzem auf den Release-Kandidaten für Kompatibilitäten mit DeadBolt aktualisiert und festgestellt, dass die Anwendung nicht mehr ausgeführt wird.Play 2.1 und Neo4J WrappingNeoServer Fehler mit Logback.xml

Zum Starten des Servers ich folgendes tun:

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(); 

Leider bekomme ich dann:

> java.lang.RuntimeException: 
> org.neo4j.kernel.lifecycle.LifecycleException: Component 
> '[email protected]' failed to 
> initialize. Please see attached cause exception. 

Ich habe versucht, slf4j und logback Entfernen von Abhängigkeiten von meinem Build.scala wo Neo4j-Server wird hinzugefügt, aber ohne Erfolg. Es scheint, dass die falsche logback.xml von neo4j geladen wird. Wenn ich notTransitive() zur Abhängigkeit neo4j-server hinzufüge, verschwinden auch die Warnungen logback.xml beim Start. Ich stelle mir vor, dass die neo4j-spezifische logback.xml in den Jar eingebettet ist und das Problem verursacht. Eine mögliche Lösung, die ich sehe, ist, eine benutzerdefinierte Konfiguration über Code zu schreiben, aber ich bin mir nicht sicher, wie das geht. Irgendwelche Gedanken? Als Referenz, erhalte ich diese Fehler beim Start:

>  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 

Siehe unten für die volle Ausnahme:

> 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 Details

ich die logback.xml Datei aus play_2 entfernt. 10.jar und nicht mehr die doppelte Warnung vom Logback beim Start der Play-Anwendung erhalten.

Ich habe dann versucht Lokalisierung der Inhalte von logback.xml Projekt und play2.1 logback.xml als custom-logback.xml innerhalb der Wurzel meines spielen sowohl in der Neo4j setzen. Der gleiche Pfad wie Play.application(). Path() Vielleicht ist dies der falsche Ort für neo4j, um es aufzunehmen?

Beim Überprüfen der Abhängigkeiten habe ich einen janino von neo4j-Server benötigt. Außerdem sehe ich keine Konflikte in Gläsern für die Protokollierung, aber vielleicht fehlt mir etwas. Hier ist meine Abhängigkeitshierarchie von ‚Play Abhängigkeiten‘:

https://gist.github.com/4559389

Ich habe auch versucht die Standardkonfiguration Kopieren auf der Play2.1 aufgeführten Wiki, wie unten in custom-logback.xml ohne Erfolg:

<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> 

EDIT 2

scheint definitiv ein Problem mit der logback Abhängigkeit zu sein. Neo4j hängt von 0.9.30 ab und das Spiel hängt von 1.0.7 ab. Ich nehme an, es gibt einen Wechsel zwischen diesen Versionen, wenn die Bibliothek von? Janino geladen wird? Es kann die geeignete Methode nicht finden. Immer noch unsicher, wie in logback.xml richtig angegeben werden muss, um die richtige Abhängigkeit zur Laufzeit auszuwählen. Play2.1RC1 Logback Dependency Neo4j Logback Dependency

Graphs erzeugt wurden durch yed + SBT-Abhängigkeitsgraphen.

+0

Ich laufe auf die gleichen Probleme ... – fynn

+0

Ich auch ... sehr frustrierend. – Mikesname

+0

@steveturner Front der gleichen Frage, auf der Suche nach einem Seil ^^ – Mik378

Antwort

5

In Bezug auf die Lifecycle-Ausnahme Neo4j, die geworfen wird, weil Play 2.1 neuere Version von Logback ist nicht kompatibel mit Neo4js. Ich lief in diese Frage und am Ende nur durch eine ältere, kompatible Version Spiele-logback zwingendes setzen diese in meiner Build.scala Projektabhängigkeit:

"ch.qos.logback" % "logback-core" % "1.0.3" force(), // this should override the Play version 
"ch.qos.logback" % "logback-classic" % "1.0.3" force(), 

Obendrein habe ich versucht, auch ohne Einbeziehung der log4j transitiven Abhängigkeiten gezogen wird indem ivyXML Parameter des SBT:

ivyXML := 
    <dependencies> 
    <exclude module="log4j"/> 
    </dependencies> 

Dies ist offensichtlich ein fragiles fix, aber zumindest für Wiedergabe 2.1-RC2, scheint es zu funktionieren. Ich habe immer noch Probleme konfigurieren tatsächlich die Protokollierung für Neo4j, also werde ich versuchen, diese Antwort später zu aktualisieren.

Update: Da ich Logback neu bin, hatte ich ein bisschen Schwierigkeiten bei der Konfiguration mit Play/Neo4j. Um zu verhindern, dass der Logback in Statusmeldungen fehlschlägt und mich ertränkt, musste ich eine Datei namens custom-logback.xml in das conf-Verzeichnis meiner Play-App legen. Ich denke, dass die Neo4j Logging-Konfiguration dies erfordert. Mine enthält folgende Komponenten:

<included> 
    <logger name="eu.mypackage" level="info"> 
    </logger> 

    <logger name="org.neo4j" level="warn"> 
    </logger> 

    <root level="warn"> 
    </root> 
</included> 

Auch in meinem conf, schien ich eine Datei logback.properties die (in meinem Fall) enthält nur diese Zeile genannt müssen:

CONSOLE_LEVEL=ERROR 

(Logback Experten, fühlen sich frei, irgendetwas davon zu korrigieren)

+0

Haben Sie Logbuchdateien aus den verwendeten Jars entfernt? Ich erhalte Warnungen bezüglich einer doppelten logback.xml Datei. Eins in 'play_2.10/2.1-RC2/jars/play_2.10.jar!' Und eins in 'org.neo4j.app/neo4j-server/jars/neo4j-server-1.9.M04.jar!' – fynn

+0

@fynn : Weißt du, ich denke, ich habe 'logback.xml' aus dem Play 2.1-RC2 Jar entfernt, um darüber nachzudenken. Ich werde noch mehr nachforschen. – Mikesname

+0

Ich kann bestätigen, dass das Entfernen der logback.xml-Dateien aus dem Repository-Cache die Warnungen löscht und Sie ausführen können, wenn Sie den obigen Empfehlungen von @Mikesname folgen. – steveturner

2

Sie scheinen in zwei getrennte Probleme zu laufen. Eine davon ist, dass Play eine logback.xml-Datei bereitstellt, die mit der von Neo in Konflikt steht. Zweitens scheinen Sie zwei Versionen des Logbacks für den Klassenpfad zu haben, was vermutlich die NoSuchMethodError-Ausnahme verursacht.Wenn Sie die Datei playlogback.xml entfernen und diesen Inhalt in eine Datei namens "/custom-logback.xml" (die Neo über unsere Logback-Konfiguration enthält) einfügen und dann sicherstellen, dass Sie nur eine Version von Logback (oder speziell Janino), das sollte helfen.

+0

Rickard - siehe https://gist.github.com/4559389 für Abhängigkeiten. Ich sehe keine Logbuchkopie, aber vielleicht verpasse ich etwas. – steveturner

1

Letztendlich war ich nicht in der Lage, das Abhängigkeitsproblem zwischen Play 2.1, Neo4J und Logback zu lösen. Ich bin mir sicher, dass es eine einfache und schnelle Lösung ist, aber ich bin mir nicht sicher, wie ich vorgehen soll, ohne die Paketabhängigkeit explizit zu ändern. Stattdessen habe ich mich entschieden, den Neo4J Java REST binding zu verwenden, um den eingebetteten Server vorerst zu ersetzen. Funktioniert gut und hatte nur einige kleine Fehler mit Unterschieden zwischen der nativen API und dem REST-Wrapper. Ich habe die Abhängigkeiten für den eingebetteten Server in Build.scala verlassen und auch die eingebetteten und REST-Dienste von einer gemeinsamen Schnittstelle so aufgeteilt, dass sie zur Laufzeit angegeben werden können. Ich denke, idealerweise sollten diese beide Plugins für Play sein ...

0

diese oben auf die Frage Beschreibung völlig unabhängig klingen, aber:

Das Problem für uns - ich auf einem Mac bin, mein c. olleague auf Ubuntu - es stellte sich heraus, dass die Bibliotheksabhängigkeiten in das Verzeichnis play/lib gezogen wurden, das (aus welchen Gründen auch immer) nicht dort gewesen sein sollte, was in unserem Fall zwei Versionen von Janino - 2.5.10 und 2.6.1 und Entfernen war Die ältere Version behob das Problem.

Mein Kollege hat etwas über die Unterschiede in den Namenskonventionen zur Identifizierung dieser beiden Releases erwähnt, die möglicherweise das Problem verursacht haben.

Also zusammenfassend; Überprüfen Sie in bestimmten Fällen das Verzeichnis/lib auf nicht erforderliche oder unerwartete Bibliotheken.