Questions & Answers

SWilde
I'm new here

Classloader & 3rd-Party-Jars

Hallo Zusammen,

Ich denke ich habe ein Problem mit dem Classloader.

Konkret habe ich eine ProjectApp geschrieben, die einige 3rd-Party-Jars mitbringt.

Die ProjectApp bringt eine Klasse mit, die den Programmablauf enthรคlt und aus einem Beanshell-Skript im SiteArchitect aufgerufen wird.

In der App sollen aus einem bestehenden System Dokumente gelesene werden und anschlieรŸend ins FirstSpirit importiert werden.

Dazu wird irgendwann im Programmablauf in einer der 3rd-Party-Jars ein XML-Parser gebraucht.


ERROR:  'Das erste Argument fรผr die nicht-"static"-Java-Funktion "externalURL" ist keine gรผltige Objektreferenz.'

FATAL ERROR:  'Das erste Argument fรผr die nicht-"static"-Java-Funktion "externalURL" ist keine gรผltige Objektreferenz.'

javax.xml.transform.TransformerConfigurationException: Das erste Argument fรผr die nicht-"static"-Java-Funktion "externalURL" ist keine gรผltige Objektreferenz.

       at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source)

       ...

       ...


Eigentlich sollte an dieser Stelle ein eigene TransformerFactory genutzt werden.

Diese liegt in einem der Jars und sollte fรผr den FactoryFinder durch einen Eintrag im META-INF-Verzeichnis des Jars("META-INF/services/javax.xml.transform.TransformerFactory") zu finden sein.

Auszug aus der Standard-Java-Klasse javax.xml.transform.TransformerFactory:

public static TransformerFactory newInstance()

        throws TransformerFactoryConfigurationError {

        try {

            return (TransformerFactory) FactoryFinder.find(

            /* The default property name according to the JAXP spec */

            "javax.xml.transform.TransformerFactory",

            /* The fallback implementation class name, XSLTC */

            "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");

        } catch (FactoryFinder.ConfigurationError e) {

            throw new TransformerFactoryConfigurationError(

                e.getException(),

                e.getMessage());

        }

    }

Wie es ausschaut greift hier der Fallback.

Versuche ich die Klasse direkt in meiner ProjectApp aufzurufen:

Class.forName("paket.klassenname");

ist diese auch zu finden.


Setze ich anschlieรŸend ein entsprechendes System.property


System.setProperty("javax.xml.transform.TransformerFactory", "paket.klassenname");

erhalte ich im nach folgenden Programmablauf eine ClassNotFoundException an entsprechender Stelle:

java.lang.ClassNotFoundException: paket.klassenname

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

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

        at javax.xml.transform.FactoryFinder.getProviderClass(Unknown Source)

        at javax.xml.transform.FactoryFinder.newInstance(Unknown Source)

        at javax.xml.transform.FactoryFinder.find(Unknown Source)

        ... 35 more

Anscheinend habe ich hier ein kleines ClassLoader-Problem bei dem ich mir leider nicht zu helfen weiรŸ.

Die ganzen Jars habe ich schon auf verschiedene Weisen versucht รผber die module.xml einzubinden.

Entweder waren diese als Library-Komponene oder direkt in der ProjektApp mit server-Scope angegeben.

In beiden Fรคllen habe ich versucht einmal diese ganzen 3rd-Party-Jars einzeln oder zusammen in einer groรŸen Jar-Datei zu laden.

Allerdings konnte ich keine Unterschiede bei der Ausfรผhrugn feststellen.

Kann mir jemand einen Hinweis geben warum die gesucht Klasse zwar im Modul, aber nicht รผber den System(?)-ClassLoader zu finden ist?

Viele GrรผรŸe

Stephan

0 Kudos
3 Replies
thmarx
I'm new here

Hallo,

um welche FS Version handelt es sich hier?

Kannst du bitte deine module.xml mal hier posten.

GruรŸ

Thorsten

0 Kudos

Hallo,

konntest du dein Problem inzwischen selbst lรถsen? Dann wรคre es gut, wenn du die Lรถsung hier kurz erlรคutern wรผrdest. Falls du weiterhin Unterstรผtzung benรถtigst, solltest du Thorstens Fragen beantworten.

Viele GrรผรŸe

Tim

0 Kudos
andreas_kendel
New Creator

Ich bin gerade รผber diesen Forenbeitrag gestolpert, weil ich ein รคhnliches Problem hatte. Wir haben ein Modul das eine Public-Klasse enthรคlt, รผber die per Skript ein Import-Auftrag gestartet wird.

Ich habe auch einige 3rd-Party Libraries zum XML Parsen verwendet und festgestellt, dass keine Klassen รผber javax.xml.parsers.FactoryFinder instanziiert werden kรถnnen.

Es sieht so aus als kรถnnte die Klasse FactoryFinder keine Resourcen aus dem Modul finden. Ich habe dann festgestellt, dass die Klasse FactoryFinder den Classloader aus dem Thread verwendet. Als Lรถsung habe den Classloader im Thread รผberschrieben. Ich weiรŸ nicht ob das eine empfehlenswerte Lรถsung ist aber bei mir hat es das Problem gelรถst.

ClassLoader originClassLoader = Thread.currentThread().getContextClassLoader();

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

try {

     //execute your code

} catch (Exception e) {

     //Log exception here

} finally {

     Thread.currentThread().setContextClassLoader(originClassLoader);

}

0 Kudos

Type a product name