2013-01-17 11 views
10

Avevo un server neo4j incorporato con console di amministrazione che funziona in un'applicazione Play 2.0.1. Recentemente ho aggiornato alla versione candidate per compatibilità con DeadBolt e ho scoperto che l'applicazione non funziona più.Errori Play 2.1 e Neo4J WrappingNeoServer con Logback.xml

Per avviare il server che stavo facendo la seguente:

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

Purtroppo Allora ottengo:

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

Ho provato a rimuovere SLF4J e logback dipendenze dal mio Build.scala dove Neo4j server viene aggiunto ma senza risultato. Sembra che il logback.xml sbagliato sia stato caricato da neo4j. Inoltre, se aggiungo notTransitive() alla dipendenza neo4j-server, gli avvisi di logback.xml all'avvio scompaiono. Immagino che il logback.xml specifico di neo4j sia incorporato nel/i jar e causi il problema. Una potenziale soluzione che vedo è scrivere una configurazione personalizzata tramite codice, ma non sono sicuro di come farlo. qualche idea? Per avere un riferimento, ottengo questi errori in fase di avvio:

>  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 

Vedere sotto per l'intero eccezione:

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

ho rimosso il file logback.xml da play_2. 10.jar e non riceve più l'avviso duplicato dal logback all'avvio dell'applicazione di riproduzione.

Ho quindi provato a localizzare il contenuto di entrambi neo4j logback.xml e play2.1 logback.xml come custom-logback.xml all'interno della radice del mio progetto di riproduzione. Lo stesso percorso di Play.application(). Path() Forse questa è la posizione sbagliata per neo4j per raccoglierlo?

Quando si riesaminano le dipendenze, ho un janino richiesto da neo4j-server. Inoltre, non vedo alcun conflitto nei barattoli per la registrazione, ma forse mi manca qualcosa. Ecco la mia gerarchia delle dipendenze da 'dipendenze' di gioco:

https://gist.github.com/4559389

Ho anche provato a copiare la configurazione di default elencati sul wiki Play2.1 come di seguito in misura logback.xml senza successo:

<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

sembra decisamente essere un problema con la dipendenza logback. Neo4j dipende da 0.9.30 e il gioco dipende da 1.0.7 sembra. Immagino che ci sia un cambio API tra quelle versioni che quando la libreria viene caricata da? Janino? non riesce a trovare il metodo appropriato. Ancora incerto su come specificare correttamente nel logback.xml per selezionare la dipendenza corretta al runtime. Play2.1RC1 Logback Dependency Neo4j Logback Dependency

grafici sono stati generati da yed + SBT-dipendenza-grafico.

+0

Sto incontrando gli stessi problemi ... – fynn

+0

Anche io ... molto frustrante. – Mikesname

+0

@steveturner Fronte dello stesso problema, alla ricerca di una corda ^^ – Mik378

risposta

5

Riguardo all'eccezione del ciclo di vita Neo4j che viene generata perché la versione più recente di Logback di Play 2.1 non è compatibile con Neo4j. Mi sono imbattuto in questo problema e finito solo ignorando logback di gioco a una versione precedente, compatibile mettendo questo nelle mie dipendenze del progetto di 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(), 

Per buona misura Ho anche provato ad esclusione di qualsiasi log4j dipendenze transitive essere tirato in impostando ivyXML parametro di SBT:

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

si tratta ovviamente di una correzione fragile, ma, almeno per gioco 2.1-RC2, sembra funzionare. Ho ancora problemi che configurano effettivamente il logging per Neo4j, quindi cercherò di aggiornare questa risposta più tardi.

Aggiornamento: Dato che sono nuovo a Logback, ho avuto un po 'di difficoltà a configurarlo con Play/Neo4j. Per evitare il logback da errori e annegarmi nei messaggi di stato, avevo bisogno di inserire un file chiamato custom-logback.xml nella directory conf della mia app Play. Penso che la configurazione di registrazione Neo4j lo richieda. La mia contiene il seguente:

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

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

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

anche nella mia directory conf, mi sembrava di avere bisogno di un file chiamato logback.properties che (nel mio caso) contiene solo questa linea:

CONSOLE_LEVEL=ERROR 

(esperti logback, sentitevi liberi per correggere tutto questo)

+0

Hai rimosso dei file di logback dai vasi usati? Continuo a ricevere avvisi relativi a un file logback.xml duplicato. Uno in 'play_2.10/2.1-RC2/jars/play_2.10.jar!' E uno in 'org.neo4j.app/neo4j-server/jars/neo4j-server-1.9.M04.jar! ' – fynn

+0

@fynn : Sai che penso di aver rimosso 'logback.xml' dal jar di Play 2.1-RC2, venuto a pensarci. Farò qualche altra investigazione. – Mikesname

+0

Posso confermare che la rimozione dei file logback.xml dalla cache del repository elimina gli avvisi e consente di eseguirli se si seguono i suggerimenti di @Mikesname riportati sopra. – steveturner

2

Sembra che tu stia incontrando due problemi separati. Uno è che Play fornisce un file logback.xml che è in conflitto con Neo. In secondo luogo, sembra che ci siano due versioni di logback su classpath, che suppongo stia causando l'eccezione NoSuchMethodError.Se è possibile rimuovere il file Play logback.xml e inserire quel contenuto in un file chiamato "/custom-logback.xml" (che Neo includerà tramite la nostra configurazione di logback), e quindi assicurarsi di avere solo una versione di Logback (o nello specifico, Janino), che dovrebbe aiutare.

+0

Rickard - consultare https://gist.github.com/4559389 per le dipendenze. Non vedo un duplicato di logback ma forse mi manca qualcosa. – steveturner

1

In definitiva non sono stato in grado di risolvere il problema delle dipendenze tra Play 2.1, Neo4J e il logback. Sono sicuro che sia una soluzione facile e veloce, ma non sono sicuro su come procedere senza modificare esplicitamente la dipendenza del pacchetto. Invece ho optato per utilizzare il Neo4J Java REST binding per sostituire il server incorporato per il momento. Funziona bene e ha avuto solo qualche piccolo inconveniente con differenze tra l'API nativa e il wrapper REST. Ho lasciato le dipendenze per il server incorporato in Build.scala e diviso i servizi embedded e REST da un'interfaccia comune in modo tale che possano essere specificati in fase di runtime. Credo che idealmente entrambi dovrebbero essere plugin per Play ...

0

questo può sembrare completamente estranei alla descrizione del problema di cui sopra, ma:

il problema per noi - sono su un Mac, il mio c. olleague su Ubuntu - si è scoperto che le dipendenze delle librerie venivano inserite nella directory di Play/lib che non avrebbe dovuto essere lì (per qualsiasi motivo), che nel nostro caso erano due versioni di Janino - 2.5.10 e 2.6.1, e la rimozione la versione precedente ha risolto il problema.

La mia collega ha menzionato qualcosa sulle differenze nelle convenzioni di denominazione utilizzate per identificare queste due versioni, che potrebbero aver causato il problema.

Quindi in sintesi; in alcuni casi, controlla la directory/lib per le librerie non essenziali o inaspettate.

Problemi correlati