Hallo zusammen,
ich kämpfe gerade schon wieder mit der Einbindung meiner Klassen in mein Hauptprogramm rum und erhalte ständig
eine ClassNotFoundException wenn ich es ausserhalb von Eclipse laufen lassen will. Entweder ich kapier nicht was in den FAQ steht bezüglich Manifest und Classpath, oder der Fehler liegt irgendwo anders. Vielleicht kann ja mal jemand ein Auge drauf werfen.
Ich habe da das Hauptprogramm mit:
==> der Hauptdatei SiBSe.jar, mit einer Klasse ModulManager.class (und anderen zusammen aus Eclipse exportiert)
==> der ModulManager soll mir Dateien zur Laufzeit aus anderen Packages laden.
die anderen Packages mit einer zu ladenden Klasse:
==> Glaukom.jar
==> enthält eine Klasse Glaukom.GlaukomMOD
und so weiter. Die Packages bedinden sich im Unterverzeichnis \module der Anwendung und laufen soll das ganze auf Windows.
Das sind die wichtigsten Auszüge aus der Klasse Modulmanager. Die Namen werden mit getFileNames() aus einem Verzeichnis ausgelesen und sind richtig. Das Format für den Aufruf des URLClassLoader ist dann packagename.packageNameMOD.
Gestartet wird das ganze mit einer .bat Datei aus c:\Test herraus:
set CLASSPATH=%CLASSPATH%;C:\Test\;c:\Test\module\;.\;
java -Xmx256m -jar SiBSe.jar
pause
Die zu ladenden .jar Dateien in die Manifest-Datei eintragen muss man nicht extra oder? Ich weis ja erst zur Laufzeit
welche da im Unterverzeichnis rumliegen. Ich hoffe das war alles was benötigt wird und jemand hat kurz Zeit. Das ganze treibt mich noch in den Wahnsinn. Auf Wunsch schicke ich auch gerne den ganzen Quellcode oder das EclipseProjekt zu wenn's was hilft.
Lutz
ich kämpfe gerade schon wieder mit der Einbindung meiner Klassen in mein Hauptprogramm rum und erhalte ständig
eine ClassNotFoundException wenn ich es ausserhalb von Eclipse laufen lassen will. Entweder ich kapier nicht was in den FAQ steht bezüglich Manifest und Classpath, oder der Fehler liegt irgendwo anders. Vielleicht kann ja mal jemand ein Auge drauf werfen.
Ich habe da das Hauptprogramm mit:
==> der Hauptdatei SiBSe.jar, mit einer Klasse ModulManager.class (und anderen zusammen aus Eclipse exportiert)
==> der ModulManager soll mir Dateien zur Laufzeit aus anderen Packages laden.
die anderen Packages mit einer zu ladenden Klasse:
==> Glaukom.jar
==> enthält eine Klasse Glaukom.GlaukomMOD
und so weiter. Die Packages bedinden sich im Unterverzeichnis \module der Anwendung und laufen soll das ganze auf Windows.
Das sind die wichtigsten Auszüge aus der Klasse Modulmanager. Die Namen werden mit getFileNames() aus einem Verzeichnis ausgelesen und sind richtig. Das Format für den Aufruf des URLClassLoader ist dann packagename.packageNameMOD.
Code:
package src.data;
public class ModulManager {
private File sourceDir;
private Modul[] module;
private Hashtable modulTable;
public ModulManager(String path) {
sourceDir = new File(path);
modulTable = new Hashtable();
try{
try {
module = this.getModule();
} catch (NoClassDefFoundError e1) {
CoreControl.showMessage("Fehler beim Laden der Module. Es wurden keine Module geladen.\n" +
"Bitte überprüfen Sie das Modulverzeichnis in den Einstellungen.\n\n"+e1.toString());
} catch (ClassNotFoundException e1) {
CoreControl.showMessage("Fehler beim Laden der Module. Es wurden keine Module geladen.\n" +
"Bitte überprüfen Sie das Modulverzeichnis in den Einstellungen.\n\n"+e1.toString());
} catch (InstantiationException e1) {
CoreControl.showMessage("Fehler beim Laden der Module. Es wurden keine Module geladen.\n" +
"Bitte überprüfen Sie das Modulverzeichnis in den Einstellungen.\n\n"+e1.toString());
} catch (IllegalAccessException e1) {
CoreControl.showMessage("Fehler beim Laden der Module. Es wurden keine Module geladen.\n" +
"Bitte überprüfen Sie das Modulverzeichnis in den Einstellungen.\n\n"+e1.toString());
}
for (int i=0 ; i<module.length ; i++) {
modulTable.put(module[i].getName(), module[i]);
}
} catch (NullPointerException e){
}
}
private Modul[] getModule() throws NullPointerException,
ClassNotFoundException, NoClassDefFoundError, InstantiationException, IllegalAccessException{
String[] modulNames = getFileNames();
Modul[] ret = new Modul[modulNames.length];
URL[]url = new URL[modulNames.length];
try {
for (int i = 0; i<url.length;i++){
url[i]= new File(CoreControl.config.getPath()).toURL();
}
} catch (MalformedURLException e) {
CoreControl.showMessage("Fehler beim Laden der Module.\n" +
"Überprüfen sie bitte das angegebene Verzeichnis."+e.toString());
//e.printStackTrace();
}
URLClassLoader cl = new URLClassLoader(url);
for (int i = 0; i < modulNames.length; i++) {
Class c = null;
Object o;
c = cl.loadClass(modulNames[i]);
o = c.newInstance();
ret[i] = (Modul) o;
}
return ret;
}
protected String[] getFileNames() {
String[] classFileNames;
File modulDir = new File(CoreControl.config.getPath());
String[] names = modulDir.list();
String path = CoreControl.config.getPath();
LinkedList classFiles = new LinkedList();
for (int i = 0; i < names.length; i++) {
if (names[i].toLowerCase().endsWith("jar")){
names[i] = names[i].substring(0,names[i].lastIndexOf("."));
classFiles.add(names[i]);
}
}
Object[] cl = new Object[classFiles.size()];
cl = classFiles.toArray();
classFileNames = new String[classFiles.size()];
if ( CoreControl.config.getVerbose()==true){
System.out.println("Gefundene Module: ");}
for (int k = 0; k < cl.length; k++) {
classFileNames[k] = cl[k].toString()+"."+cl[k]+"MOD";
if ( CoreControl.config.getVerbose()==true){
System.out.println(classFileNames[k]);
}
}
Arrays.sort(classFileNames);
return classFileNames;
}
}
Gestartet wird das ganze mit einer .bat Datei aus c:\Test herraus:
set CLASSPATH=%CLASSPATH%;C:\Test\;c:\Test\module\;.\;
java -Xmx256m -jar SiBSe.jar
pause
Die zu ladenden .jar Dateien in die Manifest-Datei eintragen muss man nicht extra oder? Ich weis ja erst zur Laufzeit
welche da im Unterverzeichnis rumliegen. Ich hoffe das war alles was benötigt wird und jemand hat kurz Zeit. Das ganze treibt mich noch in den Wahnsinn. Auf Wunsch schicke ich auch gerne den ganzen Quellcode oder das EclipseProjekt zu wenn's was hilft.
Lutz