arkaetsc
I'm new here

Service, NoClassDefFoundError

Jump to solution

Hallo zusammen,

ich schreibe gerade an einem Service der mir Daten aus einer Datenbank zurückliefern soll. Den Service selbst hab ich in FirstSpirit zum laufen bekommen, liefert mir aktuell auch schon fleißig Log-Ausgaben. Wenn ich jetzt allerdings versuche in meinem Service Klassen zu verwenden die aus einem jar stammen das am FirstSpirit Server abgelegt wurde, bekomme ich im SiteArchitect folgenden Fehler:

de/meinelib/basis/IdException

FSVersion=5.1.410.67084#3587;JDK=1.8.0_51 32bit Oracle Corporation;OS=Windows 7 6.1 x86;Date=20.08.2015 18:43:51

java.lang.NoClassDefFoundError: de/meinelib/basis/IdException

at java.lang.Class.getDeclaredMethods0(Native Method)

at java.lang.Class.privateGetDeclaredMethods(Unknown Source)

at java.lang.Class.privateGetPublicMethods(Unknown Source)

at java.lang.Class.getMethods(Unknown Source)

at sun.misc.ProxyGenerator.generateClassFile(Unknown Source)

at sun.misc.ProxyGenerator.generateProxyClass(Unknown Source)

at java.lang.reflect.Proxy$ProxyClassFactory.apply(Unknown Source)

at java.lang.reflect.Proxy$ProxyClassFactory.apply(Unknown Source)

at java.lang.reflect.WeakCache$Factory.get(Unknown Source)

Ich benutze die Klassen aus dem jar bereits an anderer Stelle in FS, wo sie auch funktioniert, aber irgendwie kann mein Service sie nicht finden.

 

Im Service:
import de.meinelib.basis.IdException


module.xml:
<library>
<ame>Tests</name>
<description>Test Module Library</description>
<resources>
<resource>lib/test.jar</resource>
< /resources>
</library>
<service>
<name>DbService</name>
  <description>Liefert Datenbankinhalte aus.</description>
<class>de.test.service.DbServiceImpl</class>
</service>
  ...

Hat jemand eine Idee woran das liegen könnte?

Ich habe hier FS 5.1 im Einsatz, falls das relevant ist.

Viele Grüße

Alex

0 Kudos
1 Solution

Accepted Solutions

Hallo zusammen,

war ein doofer Fehler.

Die Klasse ist am Server im java.class.path hinterlegt, dadurch kann ich sie auch am Server verwenden. Ich hatte die Klasse in einem ServiceProxy verwendet, der ja am Client ausgeführt wird, wo die Klasse natürlich nicht verfügbar ist.

Die Lösung war also relativ einfach, die Klasse aus dem ServiceProxy in den ServiceImpl verschieben.

Ein schönes Wochenende

Alex

View solution in original post

0 Kudos
4 Replies
bIT_sosswald
Returning Responder

Hallo Alex,

hast du es schonmal mit der Angabe eines Scopes in der module.xml versucht? Die Komponente mit den Klassen, die du verwenden möchtest, den Scope "public" zu geben könnte evtl. schon Abhilfe schaffen. (Siehe "2.5.1.2 Gültigkeitsbereich" in der Doku für Komponenten-Entwickler)


Ich glaube mich daran erinnern zu können, dass ich ohne bzw. mit falschem Scope einmal ähnliche Probleme hatte.

Hier ein Beispiel einer meiner module.xml Files.

<module>

    <name>bridgingIT - ${project.parent.artifactId}</name>

    <version>${fs.version}_${project.version}</version>

    <description></description>

    <vendor>BridgingIT GmbH</vendor>

    <components>

        <!-- Add FirstSpirit components and their configurations -->

        <service>

            <name>${project.parent.artifactId} - name service</name>

            <description>Service</description>

            <class>de.bit.fs5.name.NameService/class>

            <resources>

                <resource name="Name - service" scope="server">lib/name-service-${project.version}.jar</resource>

            </resources>

        </service>

        <public>

            <name>${project.parent.artifactId} - executable</name>

            <description>Executable to start the process</description>

            <class>de.bit.fs5.name.NameExecutable</class>

        </public>

        <library>

            <name>${project.parent.artifactId} - dependencies</name>

            <description>Contains all dependencies that are needed by other

                components of this module.</description>

            <resources>

                <resource name="Name - dependencies" scope="server">lib/name-dependencies-${project.version}.jar</resource>

            </resources>

        </library>

    </components>

</module>

Evtl. hilft dir das ja schon weiter.

Beste Grüße

Sandro

0 Kudos

Hi Sandro,

danke für den Tipp. Soweit ich das sehen kann haben library und service sowieso standardmäßig den scrope server. Habs trotzdem mal gesetzt, leider ohne Erfolg.

Das jar das ich versuche zu benutzen liegt aber nicht mit in meinem test.jar, sondern zentral am Server - wurde da händisch abgelegt. Das jar wurde hier abgelegt: /opt/web/shared/test/meinelib.jar

Aus irgendeinem Grund findet der Service aber die Klasse nicht. Wird beim Service ein anderer ClassLoader benutzt als z. B. bei Executables oder anderen Java-Klassen die in FS aufgerufen werden?

Caused by: java.lang.ClassNotFoundException: de.meinelib.basis.IdException

     at java.net.URLClassLoader.findClass(Unknown Source)

     ....

Viele Grüße

Alex

0 Kudos

Der Pfad ist nicht der Standard-Lib-Pfad des FirstSpirit-Servers. Wieso meinst du, das der von FirstSpirit aus sichtbar ist?

Z.B. über jconsole oder VisualVM kannst du dir den effektiven Klassenpfad des Server anschauen.

Peter

Hallo zusammen,

war ein doofer Fehler.

Die Klasse ist am Server im java.class.path hinterlegt, dadurch kann ich sie auch am Server verwenden. Ich hatte die Klasse in einem ServiceProxy verwendet, der ja am Client ausgeführt wird, wo die Klasse natürlich nicht verfügbar ist.

Die Lösung war also relativ einfach, die Klasse aus dem ServiceProxy in den ServiceImpl verschieben.

Ein schönes Wochenende

Alex

0 Kudos