Java-Bibliothek, fehlende Klasse TimeFormat

Für Fragen zu Plugins und zur Plugin-Entwicklung.

Moderatoren: Stellwerk-Admin, Moderatoren

Antworten
Benutzeravatar
LamaAlpen2001
R-Admin [Niederrhein, Rheinland]Erbauer
Beiträge: 487
Registriert: Di Aug 02, 2016 4:27 pm

Java-Bibliothek, fehlende Klasse TimeFormat

Beitrag von LamaAlpen2001 »

Gude,
ich habe mich auch mal ein wenig mit der Pluginschnittstelle vertraut gemacht und mich dabei an das Handbuch gehalten.
Dort gibt es einerseits die Bibliothek und das Beispiel zum Download, welche ich mir dann als Projekt in der Entwicklungsumgebung meiner Wahl eingerichtet habe (in diesem Fall VS Code).

Nachdem dies eingerichtet wurde, kam aber beim Ausführen der Fehler.

Code: Alles auswählen

Exception in thread "listenThread" java.lang.NoClassDefFoundError: js/java/schaltungen/timesystem/TimeFormat$STYLE
        at js.java.stspluginlib.PluginClient$ZugFahrplanZeile.<init>(PluginClient.java:99)
        at js.java.stspluginlib.PluginClient.parseStartTag(PluginClient.java:525)
        at js.java.tools.xml.xmlreader.startElement(xmlreader.java:326)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:518)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1387)  
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2726)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:542)       
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:889)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:825)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224)
        at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:637)
        at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:326)
        at java.xml/javax.xml.parsers.SAXParser.parse(SAXParser.java:197)
        at js.java.tools.xml.xmlreader.updateDataByString(xmlreader.java:286)
        at js.java.stspluginlib.PluginClient.run(PluginClient.java:453)
        at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.ClassNotFoundException: js.java.schaltungen.timesystem.TimeFormat$STYLE
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
        ... 19 more[code]
Also auch mal ein wenig geschaut, und sogar einen jar-decompiler angeworfen.
Dabei sehe ich Folgendes:

Sowohl die Klasse wand.java (Bsp) als auch PluginClient$ZugFahrplanZeile (Plugin) versuchen die Klasse "js.java.schaltungen.timesystem.TimeFormat" zu importiere. Mittels CMD und dem Befehl "jar tf stspluginlib.jar" stellt sich raus, dass diese Klasse halt nicht in der pluginlib existiert.
Damit sehe ich in der Form drei mögliche Wege:
  1. Nachreichen der fehlenden Klasse für die Pluginbibliothek. Gleichzeitig kann ich da jetzt auch nicht sehen, welche weiteren Abhängigkeiten dadurch entstehen.
  2. Umstellen von der eigenen Klasse für Zeitformatierung auf den von Java bereitgestellten DateTimeFormatter. Auch hier Abhängigkeiten & Spezialitäten unbekannt (wie bei 1.).

    Code: Alles auswählen

    bisher:
    private final TimeFormat tf = TimeFormat.getInstance(TimeFormat.STYLE.HM);
    
    String time = tf.formatTime(c.getSimutime());
    
    alterativ:
    private final DateTimeFormatter tf = DateTimeFormatter.ofPattern();
    
    String time = tf.format(Instant.ofEpochMilli(c.getSimutime()).atZone(ZoneId.systemDefault()));
    
    --> so zumindest mit der wand.java experimentiert
    
  3. Wie vmtl. der Großteil der anderen Plugins, selber was schreiben.
Ich könnte jetzt auch noch versuchen die Bibliothek zu decompilen, dann anzupassen, um dann zu recompilen. Ist aber dann auch keine zielführende Sache, wenns sich für alle anderen nicht ändert.
Vielleicht kann da jemand aus dem Bereich der Entwicklung mal drüber schauen.

Grüße
Paul Jakob
R-Admin: Rheinland, Niederrhein,
A+Z: Stadtbahn NRW, Berlin U-Bahn, Z: Ruhrgebiet
Antworten