zeiss-digital-innovation / SynchronizeFX

JavaFX data-binding between JVMs over the network

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Failed to instantiate SLF4J LoggerFactory

Tobisaninfo opened this issue · comments

Nach der Zusammenstellung aller Libraries wollte ich die Sliderdemo probieren und bekam folgenden StackTrace:

starting server
Failed to instantiate SLF4J LoggerFactory
Reported exception:
java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/JoranException
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
at de.saxsys.synchronizefx.core.clientserver.DomainModelServer.(DomainModelServer.java:41)
at de.saxsys.synchronizefx.core.clientserver.SynchronizeFxServer.(SynchronizeFxServer.java:48)
at de.saxsys.synchronizefx.ServerBuilder.build(ServerBuilder.java:67)
at de.saxsys.synchronizefx.sliderdemo.server.ServerApp.main(ServerApp.java:40)
Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.joran.spi.JoranException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 9 more
Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/JoranException
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
at de.saxsys.synchronizefx.core.clientserver.DomainModelServer.(DomainModelServer.java:41)
at de.saxsys.synchronizefx.core.clientserver.SynchronizeFxServer.(SynchronizeFxServer.java:48)
at de.saxsys.synchronizefx.ServerBuilder.build(ServerBuilder.java:67)
at de.saxsys.synchronizefx.sliderdemo.server.ServerApp.main(ServerApp.java:40)
Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.joran.spi.JoranException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 9 more

Hi,
ich kann den Fehler bei mir leider nicht reproduzieren. Ich starte die Demo aus meiner IDE heraus und da funktioniert es.

Die Meldung klingt für mich so als würde eine SLF4J-Implementierung fehlen. Eigentlich ist in der Maven-POM-Datei der sliderdemo die slf4j-nop Implementierung angegeben deshalb sollte das eigentlich funktionieren.

Kannst du mal versuchen, die Library "Logback-classic" mit auf den Classpath zu nehmen. Die kannst du z.B. hier runterladen.

Wenn das nicht klappt gib uns bitte ein paar mehr Informationen, wie du das Programm zu starten versuchst. Mit Maven oder aus der IDE heraus oder per Hand auf der Commandozeile?

Ich nutze Eclipse Kelper auf OS X und habe die Referenced Libraries alle hinzugefügt (durch die Angaben in der Maven-POM), allerdings teilweise in neuerer Version. Starten tut ich die Demo durch die IDE.

Ich denke mal das es irgenteinen Fehler in einer Libraray gibt. Ich kann ja mal die Libraries auflisten.

synchronizefx

Ok ich glaube logback-classic reicht alleine nicht aus. Der Pfad "ch/qos/logback/core/joran/spi/JoranException" weist auf logback-core hin. Diese Library scheint noch zu fehlen. Die gibts u.a. hier
bzw. als Maven-Dependency:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.0.9</version>
</dependency>

Soweit kommen jetzt keine Exceptions mehr nur doch folgende Bemerkung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Ich verstehe bloß nicht wieso in ClientApp gleich onServerDisconnect ausgeführt wird. Foglich wird die Stage gezeigt aber der Slider macht absolut nichts. Der Server läuft auch und localhost stimmt auch.

Die Ausgaben sind normal. Weil es eine Beispiel-Anwendung ist haben wir keine richtige Logger-Konfiguration vorgenommen.

Wenn der Server läuft und man danach den Client startet, sollte sich der Client eigentlich verbinden und alles funktionieren. Wird denn "modelReady" zuerst aufgerufen? Vielleicht kannst du da mal ein Sysout einbauen zum testen.

Nein sie wird nicht ausgeführt, allerdings gibt es auch keinen Error. Neben der Ausgabe wegen des Loggers gibt es nur in der Console Server disconnect und bei schließen noch Stopiing the client...done.

Ich könnte mir vorstellen, dass in den Tomcat-JARs Implementierungen für SLF4J drin sind, die irgendwie stören. Für die Sliderdemo werden die folgenden JARs nicht benötigt:

  • catalina.jar
  • tomcat-coyote.jar
  • servlet-api.jar
  • netty-all-4.0.14-Final.jar

außerdem werden die folgenden Bibliotheken nur für Tests benötigt:

  • junit-4.11.jar
  • mockito-all-1.9.5.jar

Da die Sliderdemo keine Websockets und kein Tomcat nutzt können die folgenden packages gelöscht werden:

  • de.saxsys.synchronizefx.tomcat
  • de.saxsys.synchronizefx.nettywebsocket

Vielleicht funktioniert die Demo wenn das alles gelöscht ist.

Naja das hat's nicht gebracht, da doch noch andere Libraries benötigt wurden. Ich kann die wenn nötig auch noch mal auflisten, allerdings habe ich die zweite Demo mit dem Pinboard probiert und auch diese war bei mir erfolglos. Keine Ahnung was ich falsch mache. Aber bei der anderen Demo kam auch nicht die Meldung von Disconnection oder ähnliches, nur die Meldung über den Logger.

Ich verstehe das irgendwie nicht was da falsch ist. Ich werde nochmals ein Bild mit dem Project anhängen, falls es dir weiterhelfen sollte. Auch ich habe noch nicht ganz den sinn von Netty-3.9.0Final verstanden, aber anscheinend ist das notwendig, da Eclipse die Packages beginnend mit "
scr
org.jboss.netty" nicht kennt.

Am besten lässt man bei SynchronizeFX Maven die Abhängigkeiten auflösen. Laut der POM wird z.B. eine ältere Version von netty 3 benötigt. Mit Eclipse Kepler wird das Maven Plugin glaube ich schon mitgeliefert. So kann man SynchronizeFX entweder per Git clonen oder über https://github.com/saxsys/SynchronizeFX/archive/master.zip runterladen.

In Eclipse kann man über File -> Import -> Maven -> Existing Maven Projects SynchronizeFX importieren. Eventuell muss man das zwei mal machen. Beim ersten mal importiert man alle Projekte bis auf das Parent Projekt und beim zweiten mal importiert man nur das parent Projekt und gibt dem einen anderes "Name template" (unter Advanced) an.

Dann sollte man die richtigen Dependencies haben. Der Workspace müsste dann in etwa so aussehen:

synchronizefx workspace

Ich werde bei Gelegenheit mal ein kleines Getting-Started schreiben, wo mal Schritt für Schritt das Aufsetzen der Demo erklärt wird. Die Doku ist ja aktuell wirklich noch recht knapp.

EDIT: Ich hatte vergessen, dass ich damals ja schon ein step-by-step geschrieben hatte. Da fehlt allerdings das ganze Maven-Zeug. Eventuell könnten wir das noch ergänzen. Ich habs jetzt zumindest mal nach readme.md umbenannt damit es sofort auf Github angezeigt wird wenn man in den sliderdemo-Ordner wechselt.

Vielleicht würde eine deutsche Anleitung auch helfen?

Spektakulär! Das Maven Plugin war zwar nicht bei Eclipse dabei, aber da gab es eins zum installieren. Und ich muss sagen es Funktioniert echt gut. Warum habe ich Tagelang irgentwelche Libraries gegoogle und was nicht alles. Das geht so ja richtig einfach. Mit dem Maven Zeug wird auch keine große Anleitung nötig sein. Ich danke dir vielmals für deine Ausdauernde Hilfe.

Freut mich, dass es klappt :-)
Ich denke aber wir sollten das auf jeden Fall irgendwo noch Dokumentieren damit es in Zukunft für den nächsten einfacher wird. Bis dahin würde ich den Issue hier noch offen lassen.

Eine frage noch hast du eine Möglichkeit für nicht wie ich die Projecte als jar oder so Exportieren kann um es später in eigenen Projekten nutzen kann. Das Problem was ich momentan habe ist das die zusätzlichen Libraries von Eclipse nicht mit berücksichtigt werden.

Das ist aktuell leider nicht so trivial weil SynchronizeFX noch nicht in einem öffentlichen maven-Repository verfügbar ist. Sobald das aber der Fall ist, reicht es aus, wenn du für dein eigenes Projekt auch Maven benutzt und die Abhängigkeit auf SynchronizeFX einträgst. Der rest geht dann "von alleine".

Bis es soweit ist, musst du die Bibliothek "per Hand" in dein lokales Maven-Repo bringen. Da die Demo ja jetzt läuft sollte das bei dir jetzt schon ohnehin der Fall sein.
Falls nicht:
Aus dem Howto im Wiki: "add this artifact to your local repository by invoking mvn install in the root directory of the source tree of this framework"

Per Eclipse geht das auch. Einfach auf das projekt "SynchronizeFX" rechtsklicken, dann "Run As" -> "Maven Install". Wenn das erfolgreich durchläuft, dann sollte die Bibliothek bei dir im lokalen Maven-Repository drin sein und du kannst sie normal wie alle anderen Bibliotheken mit Maven benutzen.

Ich würde auch empfehlen SynchronizeFX in eigene Projekte über Maven einzubinden. Ich habe dennoch mal das maven-assembly-plugin so konfiguriert, dass es eine Zip Datei mit allen notwendigen Abhängigkeiten erstellt. Nach einem mvn package ist die ZIP im Ordner synchronizefx/target zu finden.

Kann man das irgendwie bei Github als Download einstellen oder so? Dann könnte man das als Zip direkt runterladen. Einmal die Variante nur die Bibliothek selbst und einmal als "-dist" mit allen Abhängigkeiten? Oder spricht da was dagegen? Das kann man vermutlich nicht automatisieren nehme ich an.

Wenn man Tags (Releases) über GitHub erstellen würde, könnte man wohl Binärdateien mit anhängen. Für Git-Tags die nicht direkt über GitHub erstellt wurden scheint es nicht möglich zu sein nachträglich Binärdatien anzuhängen. Jedenfalls habe ich keine Möglichkeit gefunden.

SynchronizeFX ist jetzt über Maven Central verfügbar und muss nicht mehr von Hand installiert werden. In der Version des HowTos welche im Wiki verlinkt ist, stehen die korrekten Maven Koordinaten.

Wenn man Maven nicht nutzen möchte, kann SynchronizeFX samt seiner Abhängigkeiten unter Releases runterladen. Anscheinend kann man doch für manuell erstellte Tags Binärdateien hochladen.

Da es jetzt einfach(er) sein sollte an SynchronizeFX ran zu kommen, schließe ich das Ticket.

Vielen dank.

Das ist echt hammer geil, das ich jetzt alle JARs in den Build Path hauen kann.