Webstart .class Datei über Reflection laden

kirax

Bekanntes Mitglied
Hi

ich habe ein Problem in einer Anwendung, die ich über Web Start deployen will.
Die Anwendung stellt eine API zur Verfügung, die es ermöglicht, .class Dateien zur Runtime nachzuladen, diese zu instantiieren und in der Anwendung zur Verfügung zu stellen.

Ohne zu sehr ins Detail zu gehen:
Das Hauptfenster stellt eine JComboBox dar, in der Objekte einer gemeinsamen Oberklasse angezeigt werden. Diese sollen mithilfe der Reflection-API zur Laufzeit aus gegebenen .class Dateien kreiert werden.
Zum Laden verwende ich diesen FileClassLoader:
Java:
package com.plus.jdkp.util.reflect;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileClassLoader extends ClassLoader {

    private static FileClassLoader instance = null;
    
    public static FileClassLoader getInstance() {
	if (instance == null) {
	    instance = new FileClassLoader();
	}
	return instance;
    }
    
    private FileClassLoader() {
    }

    public Class<?> loadFromFile(File file) throws IOException {
	if (file.length() == 0 || file.length() > Integer.MAX_VALUE) {
	    throw new IllegalArgumentException();
	}
	int length = (int) file.length();
	byte[] buf = new byte[length];
	FileInputStream fis = new FileInputStream(file);
	fis.read(buf);
	fis.close();
	return super.defineClass(null, buf, 0, length);
    }
}

Die ganze Anwendung kommt in einem Jar File (das natürlich signiert ist - mit dem gleichen Zertifikat wie die anderen verwendeten Jars). Sowohl wenn ich aus meiner IDE starte, als auch aus dem Jar, funktioniert es perfekt. Die .class Datei wird gelesen und instantiiert.
Starte ich das ganze allerdings über Java Web Start bekomme ich folgende Fehlermeldung ("Anwendung kann nicht gestartet werden."):

Code:
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.sun.javaws.Launcher.executeApplication(Unknown Source)
	at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
	at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
	at com.sun.javaws.Launcher.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: com/plus/jdkp/output/GameInterface
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(Unknown Source)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at com.plus.jdkp.util.reflect.FileClassLoader.loadFromFile(Unknown Source)
	at com.plus.jdkp.util.reflect.Reflection.getClassFromFile(Unknown Source)
	at com.plus.jdkp.gui.Gui.<init>(Unknown Source)
	at com.plus.jdkp.Main.main(Unknown Source)
	... 9 more
Caused by: java.lang.ClassNotFoundException: com.plus.jdkp.output.GameInterface
	at java.lang.ClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 17 more
Dabei liegt GameInterface innerhalb des Jarfiles im Verzeichnis com/plus/jdkp/output (wie in der Exc. angegeben).

Was habe ich übersehen? Oder funktioniert das dynamische Laden von classes überhaupt mit Java Web Start?

Viele Grüße
kirax
 

Wildcard

Top Contributor
Dabei liegt GameInterface innerhalb des Jarfiles im Verzeichnis com/plus/jdkp/output (wie in der Exc. angegeben).
Das Jarfile ist eine Datei, der Inhalt der Jarfiles ist keine Datei, da nützt ein FileInputStream also wenig. Warum nimmst du nicht den URLClassloader?
 

kirax

Bekanntes Mitglied
Ich will ja nicht die GameInterface-Klasse mit meinem FileClassLoader laden. Den FileClassLoader habe ich, um die .class Dateien aus dem Dateisystem zu laden.
Das Problem ist, dass ich zur Laufzeit nicht weiß, wie die Klasse in der .class Datei die ich laden möchte, (fully qualified) heißt. Deshalb mache ich auch den Umweg über defineClass.
GameInterface liegt ja eigentlich im Classpath (im JAR, das über Webstart geholt wird).

Vielleicht sollte ich dazusagen: GameInterface ist diejenige Superklasse, deren Subklassen ich aus dem Dateisystem laden möchte.
 

kirax

Bekanntes Mitglied
Habe es gelöst.

Das Problem war, dass Webstart einen eigenen Classloader benutzt und deshalb laut Webstart-FAQ der System-Classloader keine Klassen findet.

Da GameInterface Oberklasse meiner zu ladenden Klasse ist, obliegt es meinem FileClassLoader, diese Klasse zu laden.

[JAVA=18]private FileClassLoader() {
}[/code]

Hier wird implizit ClassLoader() aufgerufen, der dann den ClassLoader.getSystemClassLoader() als parent verwendet.
Wie Wildcard schon angemerkt hat, findet mein FileClassLoader() die Klasse GameInterface nicht (da sie im jar liegt) und gibt deshalb die Zuständigkeit an seinen parent - den SystemClassLoader weiter. Der führt in Webstart jedoch zu nichts (s.o.) - deshalb wird die Klasse nicht gefunden.
Glücklicherweise liefert die Webstart-FAQ eine Problemlösung:
Einfach statt dem SystemClassLoader den Webstart-ClassLoader per Thread.getCurrent().getContextClassLoader() verwenden und diesen dann logischerweise als parent einsetzen.

[JAVA=18]private FileClassLoader() {
super(Thread.getCurrent().getContextClassLoader());
}[/code]

Das hat das Problem gelöst.

Btw: Wird die Anwendung nicht per Webstart gestartet, sind die beiden Classloader (System-Classloader und Thread.getCurrent().getContextClassLoader()) identisch.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Applet: Html Datei und Class Datei nicht im selben Verzeichnis Tools - Maven, Gradle, Ant & mehr 2
B Applet (Class-Datei(en)) in Html-Seite einbinden - Clipboard Tools - Maven, Gradle, Ant & mehr 13
D Problem beim einbinden von jar und class datei Tools - Maven, Gradle, Ant & mehr 8
A Wie kann man Quelltext von .class Datei sehen? Tools - Maven, Gradle, Ant & mehr 2
H Problem beim Verschieben der main-class -> A jni error has occured, please check... Tools - Maven, Gradle, Ant & mehr 9
M Jar kann nicht gestartet werden - main Class not found Tools - Maven, Gradle, Ant & mehr 5
F Ant ANT javac class-Dateien von entfernten JAVA-Klassen löschen Tools - Maven, Gradle, Ant & mehr 11
AlexSpritze Ant Frage zu manifest-class-path mit Target jar Tools - Maven, Gradle, Ant & mehr 1
G Nachladen von unbekannten Class-Files im JAR-Archiv Tools - Maven, Gradle, Ant & mehr 4
S Sonderzeichen in class dateien? Tools - Maven, Gradle, Ant & mehr 4
A mehrere class.dateien Tools - Maven, Gradle, Ant & mehr 10
K .class variabel laden Tools - Maven, Gradle, Ant & mehr 21
H .class in .java umformen Tools - Maven, Gradle, Ant & mehr 6
sparrow Ladevorgang von Applets (jar/class) Tools - Maven, Gradle, Ant & mehr 2
J Editor für ".class"-Dateien? Tools - Maven, Gradle, Ant & mehr 3
L class not found - und warum??? Tools - Maven, Gradle, Ant & mehr 6
Robertop maven copy-resources nicht in WAR Datei Tools - Maven, Gradle, Ant & mehr 2
H Maven NetBeans Java Application ohne Manifest-Datei Tools - Maven, Gradle, Ant & mehr 7
M Mit Maven eine jar Datei bauen ohne irgendeine main Methode Tools - Maven, Gradle, Ant & mehr 1
M Mit Maven eine jar Datei Bauen ohne irgendeine main Methode Tools - Maven, Gradle, Ant & mehr 18
L Maven Datei .zip erstellen Tools - Maven, Gradle, Ant & mehr 24
JWK Kann ich mit einem Scanner eine Datei mehrmals lesen? Tools - Maven, Gradle, Ant & mehr 3
ruutaiokwu GIT/SourceTree Client: Es wurden keine Änderungen an dieser Datei erkannt, oder es handelt sich um eine Binärdatei (?) Tools - Maven, Gradle, Ant & mehr 5
L Fertige .jar-Datei als Dependency distributen Tools - Maven, Gradle, Ant & mehr 1
J Maven Mit Maven eine ZIP Datei erstellen Tools - Maven, Gradle, Ant & mehr 0
VfL_Freak Icon einer JNLP-Datei ändern ?? Tools - Maven, Gradle, Ant & mehr 2
H Eclipse/Runnable JAR file/.fxml-Datei Tools - Maven, Gradle, Ant & mehr 1
D Ant JAR-Ressourcen in JNLP-Datei sind nicht von demselben Zertifikat signiert Tools - Maven, Gradle, Ant & mehr 2
N Ant [Android] Skript zum bauen einer .pak-Datei. Tools - Maven, Gradle, Ant & mehr 1
S Maven CSV-Datei mit Maven einlesen schlägt fehl Tools - Maven, Gradle, Ant & mehr 5
D Ant Consolen Output in Datei schreiben Tools - Maven, Gradle, Ant & mehr 5
D Jar Datei in HTML einbinden Tools - Maven, Gradle, Ant & mehr 3
K Applet als Jar-Datei in HTML einbinden Tools - Maven, Gradle, Ant & mehr 14
S Webstart Webstart einer Applikation mit einer veralteten JNLP-Datei Tools - Maven, Gradle, Ant & mehr 6
V Datei automatisch "Jaren"? Tools - Maven, Gradle, Ant & mehr 3
C bash-datei erstellen zum übergeben der parameter Tools - Maven, Gradle, Ant & mehr 9
E Ant Concat schreibt keine neue Zeile in CSV-Datei Tools - Maven, Gradle, Ant & mehr 4
D Maven, ausführbare jar-Datei unter spziellen Bedingungen - welche Plug-ins? Tools - Maven, Gradle, Ant & mehr 20
D [maven] Umgang mit property-Datei Tools - Maven, Gradle, Ant & mehr 2
G Maven Mit Maven Assemblieren und über Profiles eine properties-Datei manipulieren Tools - Maven, Gradle, Ant & mehr 2
D Maven Install Plugin: Einzelne Datei installen ? Tools - Maven, Gradle, Ant & mehr 16
S Mittel Applet Datei an ein Webserver übertragen Tools - Maven, Gradle, Ant & mehr 2
G Webstart Problem mit Adressierung bei Laden von Datei aus jar (Webstart) Tools - Maven, Gradle, Ant & mehr 5
B Jar-Datei funktioniert nicht Tools - Maven, Gradle, Ant & mehr 4
K Binärdatei aus jar auslesen und lokal als Datei speichern Tools - Maven, Gradle, Ant & mehr 2
D Maven - wo gehört eine .properties-Datei hin? Tools - Maven, Gradle, Ant & mehr 20
fastjack Jar-Datei Versionen Tools - Maven, Gradle, Ant & mehr 3
V JAR-Datei eines (J)Applet funktioniert nicht - Help! Tools - Maven, Gradle, Ant & mehr 19
C Property-Datei für Web Start Tools - Maven, Gradle, Ant & mehr 2
R Web Start / jnlp datei Tools - Maven, Gradle, Ant & mehr 28
A jar datei trotz zertifikat nich aus applet ausführbar Tools - Maven, Gradle, Ant & mehr 4
A Auslesen einer .txt Datei auf Server mit Digest Authentifizierung Tools - Maven, Gradle, Ant & mehr 2
ABstraCT Mit Applet in ne Datei auf seinem Server schreiben. Tools - Maven, Gradle, Ant & mehr 10
S Datei-/Verzeichniszugriff von signiertem Applet Tools - Maven, Gradle, Ant & mehr 6
T Applet soll Datei lesen (darf es aber nicht.) Tools - Maven, Gradle, Ant & mehr 3
G Ant in einer Batch Datei Tools - Maven, Gradle, Ant & mehr 6
B Applet als ausführbare JAR-Datei? Tools - Maven, Gradle, Ant & mehr 4
T Webstart unter Mac: Zugriff auf XSLT-Datei verweigert Tools - Maven, Gradle, Ant & mehr 4
T jnlp-Datei: Fehler in Zeile 0? Tools - Maven, Gradle, Ant & mehr 6
A Mit einem Applet eine txt-Datei einlesen und ausgeben. Tools - Maven, Gradle, Ant & mehr 6
M JEditorPane und html Datei Tools - Maven, Gradle, Ant & mehr 3
H Applet Access Denied - Beim zugriff auf eine .txt Datei Tools - Maven, Gradle, Ant & mehr 8
J Applet liest Datei nicht neu ein (nur online) Tools - Maven, Gradle, Ant & mehr 16
S Applet als ausführbare Jar-Datei Tools - Maven, Gradle, Ant & mehr 13
P .au-Datei, man hört nur blobb blobb blobb Tools - Maven, Gradle, Ant & mehr 6
H Applet in HTML-Datei - Classloader Fehlermeldung Tools - Maven, Gradle, Ant & mehr 7
M datei mit html file an applet übergeben Tools - Maven, Gradle, Ant & mehr 3
P Problem beim Senden einer Datei Tools - Maven, Gradle, Ant & mehr 5
G datei auf server speichern Tools - Maven, Gradle, Ant & mehr 8
R NullPointerException bei Einlesen von txt-Datei Tools - Maven, Gradle, Ant & mehr 12
T Highscores aus Applet-Spiel in XML-Datei speichern Tools - Maven, Gradle, Ant & mehr 7
G datei von server lesen - falsche version Tools - Maven, Gradle, Ant & mehr 2
G Datei in jar schreiben Tools - Maven, Gradle, Ant & mehr 10
A JNLP Datei aus Application laden Tools - Maven, Gradle, Ant & mehr 4
D Libarys in eine JAR Datei mit eclipse Tools - Maven, Gradle, Ant & mehr 8
thE_29 Applet Datei speichern! Tools - Maven, Gradle, Ant & mehr 42
M Eine Datei lesen mit einem Applet (gleicher Server) Tools - Maven, Gradle, Ant & mehr 2
F Eine lokale .txt Datei auf Server upladen und downloaden Tools - Maven, Gradle, Ant & mehr 3
L Datei vom Client auf Server hochladen Tools - Maven, Gradle, Ant & mehr 4
0 auf ne datei aufm server zugreifen Tools - Maven, Gradle, Ant & mehr 6
H Zugreifen auf Datei über ein Applet Tools - Maven, Gradle, Ant & mehr 13
T Java Applet Rechte zum Datei schreiben geben Tools - Maven, Gradle, Ant & mehr 3
F Aus Datei lesen und schreiben Tools - Maven, Gradle, Ant & mehr 26
F Erstellen einer Policy-Datei Tools - Maven, Gradle, Ant & mehr 8
S Ausgabe einer Methode schreibt in HTML Datei Tools - Maven, Gradle, Ant & mehr 8
R Applet schreibt in Datei auf Server - warum funktionierts ? Tools - Maven, Gradle, Ant & mehr 2
G Auf Datei zugreifen Tools - Maven, Gradle, Ant & mehr 4
M Applet in HTML-Datei einbinden Tools - Maven, Gradle, Ant & mehr 9
R Auf WebServer eine Datei schreiben? Tools - Maven, Gradle, Ant & mehr 6
R Datei Download? Tools - Maven, Gradle, Ant & mehr 9
G Applet in die HTML-Datei einbinden Tools - Maven, Gradle, Ant & mehr 3
G Mit Applet in Datei auf Webserver schreiben Tools - Maven, Gradle, Ant & mehr 4
G Applets in eine Datei schreiben lassen Tools - Maven, Gradle, Ant & mehr 2
R Datei in Java-Applet einlesen Tools - Maven, Gradle, Ant & mehr 10
J log4j2 mit Hibernate über Maven Tools - Maven, Gradle, Ant & mehr 10
T JavaFX, Jar über Maven kreieren Tools - Maven, Gradle, Ant & mehr 2
VfL_Freak Desktopverknüpfung über den Java-Cache erstellen Tools - Maven, Gradle, Ant & mehr 0
C Subversion Übersicht über zu deployende Revisionen behalten Tools - Maven, Gradle, Ant & mehr 3
C Tomcat nicht über 8080 erreichbar Tools - Maven, Gradle, Ant & mehr 3
eskimo328 Maven Firmen Repository Dependencies nicht über Internet Tools - Maven, Gradle, Ant & mehr 7

Ähnliche Java Themen

Neue Themen


Oben