JBoss Classloading

Hi,

ich komme absolut nicht weiter, hoffe hier kann mir einer helfen.

Ich habe eine web/j2ee anwendung, die auf ein jar in dem jboss/server/default/lib Verzeichnis zurückgreift. Bei diesem Zugriff versucht eine Klasse dieses jar-files eine andere externe Klasse über einen Classloader zu laden(Class myClass = Thread.currentThread().getContextClassLoader().loadClass("myClass); bzw. bevor ich den Quelltext besorg und geändert habe: Class myClass = Class.forName(„myClass“):wink:. An dieser Stelle fliegt mein Programm raus, da die Klasse nicht geladen werden kann:

Nun könnte man annehmen, das die Klasse einfach nicht gefunden werden kann(was vermutl. auch die Ursache ist) doch wie mache ich dem Classloader klar, wo er suchen soll? Ich habe ausprobiert: Klasse in den Classpath, Klasse in das Verzeichniss der Anwendung, Klasse in ein Extra-Verzeichnis(mein Ziel). Hab mir auch die JBoss Doku dazu angeschaut, verstehe aber nur die Hälfte(http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossClassL…). Hilfe ich komm nicht weiter…

Danke und Gruß

Bonkers

Hi,

Hi :wink:

Ich habe eine web/j2ee anwendung, die auf ein jar in dem
jboss/server/default/lib Verzeichnis zurückgreift. Bei diesem
Zugriff versucht eine Klasse dieses jar-files eine andere
externe Klasse über einen Classloader zu laden(Class myClass =
Thread.currentThread().getContextClassLoader().loadClass("myClass);

Nur damit ich das richtig verstehe: Das ist deine Codezeile?

bzw. bevor ich den Quelltext besorg und geändert habe: Class
myClass = Class.forName(„myClass“):wink:. An dieser Stelle fliegt
mein Programm raus, da die Klasse nicht geladen werden kann:

Und das ist der Originalcode?

Klasse in ein
Extra-Verzeichnis(mein Ziel).

Was ist genau dein Ziel? Möchtest du eine Klasse in einem beliebigen Verzeichnis ablegen und diese dann dynamisch instanzieren? Falls ja: Warum?

mfG,

J.P.Jarolim

ok, etwas ausführlicher. diese codezeile ist aus dem jar des Drittanbieters (JasperReport), welches für die Aufbereitung eines Reports eine Klasse laden muss. Da ich die Reports in einem Verzeichniss habe, würde ich auch gerne die zusätzlich benötigten Klassen dort ablegen. Leider verhält es sich wie gesagt so, das die Klasse die geladen werden muss vom JasperReport/JBoss Classloader nicht gefunden wird.Ich erhalte den Fehler:

java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JRChartCustomizer
at java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:727)
at java.lang.ClassLoader.loadClass(ClassLoader.java:284)
at java.lang.ClassLoader.loadClass(ClassLoader.java:282)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1247)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1181)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:219)
at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:72)
at net.sf.jasperreports.engine.fill.JRFillChart.(JRFillChart.java:256)

nun frage ich mich wo der eigentlich nachschaut… Laut google wird zuerst im bootstrap geschaut also, in der rt.jar und der tools.jar. Dann im System-Classpath und anschließend im normalen classpath, also den ich mitgebe: java -classpath c:\usw. Doch auch wenn ich das so definiere findet der die Klasse nicht :frowning: Ich hab schon alles möglich versucht, die Klasse in mein war/ear/jar gepackt, alles vergebens. Bin schon leicht frustriert.

gruß bonkers

myClass = Class.forName(„myClass“);

Und das ist der Originalcode?

Ist von dem drittanbieter, ich hatte den kurzzeitig abgeändert, weil es halt nicht funktioniert hat.

Was ist genau dein Ziel? Möchtest du eine Klasse in einem
beliebigen Verzeichnis ablegen und diese dann dynamisch
instanzieren?

ja, bzw. macht das instanzieren die eine klasse aus dem jar des drittanbieters. ich will halt nur das verzeichniss angeben können wo er sucht. allerdings würde mir zum anfang auch erstmal reichen, wenn er die klasse überhaupt irgendwo finden würde.

Falls ja: Warum?

siehe oben, der Report benötigt die Klasse. Du must dir das so vorstellen:

Endanwender
|
|startet report
|
Meine Anwendung(.war)
|
|
|ruft auf
|
|
JasperReport
|
|
|baut Report mit eigenem jar
|
|
JBoss organisiert diverses(z.B. login usw.)

Danke u. Gruß Bonkers

Hi,

wenn Du von Deiner Webanwendung aus auf die Klassen des JasperReports zugreifen willst, dann müssen diese im Classpath deiner Anwendung liegen. Die von Dir genannte Suchreihenfolge trifft damit nicht zu, da Deine Anwendung vom JBoss einen eigenen ClassLoader mit eigenem Classpath bekommt.
(Application Server isolieren die Classloader einzelner Andendungen)

Kannst Du im WAR File nicht die zu ladenden/anwendungsabhängigen Klassen/Archive definieren? Ich kenne den JBoss nicht genau, aber bei dem Application Server den ich verwende kann ich sogenannte „SharingReferences“ definieren, in denen ich die benötigten Klassen/Bibliotheken angeben muss, um auf diese zuzugreifen.

Hast Du zum Beispiel mal versucht, alle Klassen, die der JasperReport mitbringt in Dein Archiv reinzukopieren?

Grüsse,

Herb

1 „Gefällt mir“

Hi,
danke für deine hilfe!

wenn Du von Deiner Webanwendung aus auf die Klassen des
JasperReports zugreifen willst, dann müssen diese im Classpath
deiner Anwendung liegen.

das mache ich bereits dazu habe ich sie im /lib verzeichnis und kann auch darauf zugreifen. das problem ist, das eine Klasse des JasperReports ein andere Klasse dynamisch laden will und das nicht kann!

Die von Dir genannte Suchreihenfolge
trifft damit nicht zu, da Deine Anwendung vom JBoss einen
eigenen ClassLoader mit eigenem Classpath bekommt.
(Application Server isolieren die Classloader einzelner
Andendungen)

danke für diese info, jetzt weiss ich schonmal mehr. um genau zu sein hat jasperreport einen eigenen classloader.

Kannst Du im WAR File nicht die zu
ladenden/anwendungsabhängigen Klassen/Archive definieren?

das habe ich versucht, hat aber nicht funktioniert

Ich
kenne den JBoss nicht genau, aber bei dem Application Server
den ich verwende kann ich sogenannte „SharingReferences“
definieren, in denen ich die benötigten Klassen/Bibliotheken
angeben muss, um auf diese zuzugreifen.

das check ich mal…

Hast Du zum Beispiel mal versucht, alle Klassen, die der
JasperReport mitbringt in Dein Archiv reinzukopieren?

ja, war aber nüx.

danke nochmal, gruß bonkers