DennyF
New Creator

NoClassDefFoundError beim Ausführen eines Executable in einem Auftrag

Jump to solution

Hallo,

ich habe ein einfaches Executable welches JSON Daten bekommt und diese parsen und dann in eine entsprechende Datenbank schreiben soll. 

Nun habe ich Jackson für das JSON parsen hinzugefügt, bekomme aber beim Ausführen im Auftrag folgenden Fehler:

(de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper

Ich habe das Forum hier bereits nach einer Lösung durchsucht, bin aber nicht fündig geworden, vielleicht ja jemand hier eine Idee. Hier noch meine Module.xml in der alles konfiguriert ist:

 

<module>
<name>CoT Sync</name>
<version>0.0.1-SNAPSHOT</version>
<description>Executable syncing CoT data to first spirit</description>

<components>
<public>
<name>CotSyncExecutable</name>
<class>com.xxx.modules.cotsync.executable.CotSyncExecutable</class>
</public>
</components>

<resources>
<resource name="com.xxx.modules:cot-sync-to-fs" scope="module">lib/CoT Sync-0.0.1-SNAPSHOT.jar</resource>
<resource name="com.fasterxml.jackson.core:jackson-databind" scope="module" mode="isolated" version="2.14.2">lib/jackson-databind-2.14.2.jar</resource>
</resources>

</module>
0 Kudos
1 Solution

Accepted Solutions
Windmüller
Crownpeak employee

Ein "NoClassDefFoundError" bedeutet, dass die Klasse zwar auf dem Classpath vorhanden ist, aber nicht geladen werden kann. Oft steht im Stacktrace dann noch der eigentliche Grund, etwa eine ClassNotFoundException.

Im Moduldeskriptor sehe ich nur "jackson-databind", aber das hat compile-Abhängigkeiten u.a. gegen jackson-core.

Solche Fehler passieren häufig, wenn der Moduldeskriptor manuell geschrieben wird. Besser wäre z.B. die Verwendung des FSM Gradle Plugin, welches die Abhängigkeiten automatisch einbindet.

View solution in original post

0 Kudos
5 Replies
hoebbel
Crownpeak employee

Hallo DennyF,

die Ressource "com.xxx.modules:cot-sync-to-fs" ist ohne mode="isolated" eingebunden worden, wird also über den Legacy Classloader geladen und sieht deshalb die Ressource "com.fasterxml.jackson.core:jackson-databind", die über den modullokalen Isolated Classloader geladen wird, nicht. 

Versuch mal beide Ressourcen als "isolated" einzubinden.

Wenn das nicht hilft, könnte noch das Problem sein, dass der Ausführungskontext keinen modul-lokalen Zugriff zulässt. Dann müsste Jackson mit scope="server" eingebunden werden. Ich gehe aber davon aus, dass dies nicht notwendig sein sollte.

Viele Grüße
Holger

0 Kudos

Hallo Holger,

ich habe zunächst versucht beide Resourcen im mode="isolated" einzubinden, das hat jedoch für den gleichen Fehler gesorgt.

Als nächstes habe ich jackson mit scope="server" eingebunden, aber auch das hat leider nichts gebracht.

 

Grüße

Denny

0 Kudos
hoebbel
Crownpeak employee

Hallo Denny,

ich fürchte, jetzt wird es etwas komplizierter. Wenn der Fehler auch kommt, wenn die Jackson Ressource mittels scope="server" mode="isolated" eingebunden ist, dann ist es wahrscheinlich kein "einfaches Konfiguratiobnsproblem", sondern ein Classloading Problem. Ich vermute, dass es ein weiteres Modul gibt, dass eine andere Jackson Version mitbringt, in der die entsprechende Klasse nicht enthalten ist. 

Wenn ihr die FirstSpirit Version 2023.1 (oder neuer) einsetzt, dann werden entsprechende Konflikte in der Modulübersicht angezeigt (Servermanager->Server/Eigenschaften->Module {ServerAdmin Rechte benötigt}). Dann müsstest Du ein rotes Icon vor deinem Modul sehen. Als Popup wird Dir dann angezeigt, welches andere Modul den Konflikt hervorruft.

Wenn ihr eine ältere FirstSpirit Version einsetzt, wäre es am einfachsten, die Module (fsm Dateien im Ordner <FirstSpiritROOT>/data.modules) darauf zu prüfen, ob irgendwo noch eine Jackson Version (wahrscheinlich eine 1er Version) ist mit scope="server". Entweder musst Du dann diese Version verwenden oder auf andere Art dafür sorgen, dass nur eine Jackson Version im Classpath ist.

Ich hoffe, dass hilft weiter

Schönes Wochenende
Holger

0 Kudos
Windmüller
Crownpeak employee

Ein "NoClassDefFoundError" bedeutet, dass die Klasse zwar auf dem Classpath vorhanden ist, aber nicht geladen werden kann. Oft steht im Stacktrace dann noch der eigentliche Grund, etwa eine ClassNotFoundException.

Im Moduldeskriptor sehe ich nur "jackson-databind", aber das hat compile-Abhängigkeiten u.a. gegen jackson-core.

Solche Fehler passieren häufig, wenn der Moduldeskriptor manuell geschrieben wird. Besser wäre z.B. die Verwendung des FSM Gradle Plugin, welches die Abhängigkeiten automatisch einbindet.

0 Kudos

Vielen Dank, ich habe es nochmal von Anfang an wiederholt und mit em Gradle Plugin erstellt und jetzt funktioniert alles wunderbar.

0 Kudos