Hallo,
Ich hab derzeit ein Problem, was mich echt verrückt macht. Ich habe eine Art Modulsystem, wo nachträglich Jar-Dateien nachgeladen werden. Da diese Jar-Dateien vielleicht auch noch Konfigurationen enthalten, wollte ich es so lösen, dass die Klasse, die beim installieren des Moduls als Einstiegspunkt gilt, eine Annotation haben kann, welche dem eigentlichen Kernprogramm dann mitteilt, dass es das Package dieser Klasse nach Konfigurationsdateien durchsuchen soll.
Dafür hab ich extra die eine Funktion hier geschrieben:
Soweit sieht es ja gut aus. Aber wenn ich nun eine Jar-Datei lade, welches die bestimmten Annotationen enthält und diese Funktion aufgerufen wird, dann kommt bei der Debug Ausgabe #1
und bei der Debug Ausgabe #2 ein false.
Also die Pfadangabe in der Ausgabe #1 ist völlig korrekt (der Pfad ist natürlich anders ). Nur hat Java irgendwie Probleme mir eine File-Referenz auf dieses Package zurück zu liefern.
Ich hatte mal ein Beispielprogramm geschrieben, wo dies auch normal ging, aber immer der gleiche ClassLoader vorhanden war. In diesem Beispiel ist es so, dass das Modul in einem URLClassLoader hängt und diese statische Funktion in dem normalen ClassLoader hängt, der vom System beim Aufruf genommen wird, hängt.
Mit getResourceAsStream kann ich leider nichts anfangen, weil ich ja nur das Package durchsuchen will nach bestimmten Dateien (in dem Fall Konfigurationsdateien).
Ich hoffe jemand weiß eine Lösung (wenn ich ein Package in dem gleichen Jar suche, wo diese Funktion ist, dann klappt es)
Gute Nacht KoMtuR
Ich hab derzeit ein Problem, was mich echt verrückt macht. Ich habe eine Art Modulsystem, wo nachträglich Jar-Dateien nachgeladen werden. Da diese Jar-Dateien vielleicht auch noch Konfigurationen enthalten, wollte ich es so lösen, dass die Klasse, die beim installieren des Moduls als Einstiegspunkt gilt, eine Annotation haben kann, welche dem eigentlichen Kernprogramm dann mitteilt, dass es das Package dieser Klasse nach Konfigurationsdateien durchsuchen soll.
Dafür hab ich extra die eine Funktion hier geschrieben:
Java:
public static File[] getFilesInPackage(Class<?> clazz, String fileEnding) {
if(!fileEnding.startsWith("."))
fileEnding = "."+fileEnding;
ArrayList<File> packageFiles = new ArrayList<File>();
String newPackageName = "/" + clazz.getPackage().getName().replace('.', '/');
//Debug Ausgabe #1
System.out.println("Path: " + clazz.getResource(newPackageName).getFile());
//Debug Ausgabe #2
System.out.println("File exists: "+ new File(clazz.getResource(newPackageName).getPath()).exists());
File packageDir = new File(clazz.getResource(newPackageName).getFile());
if(packageDir.exists() && packageDir.isDirectory()) {
File[] files = packageDir.listFiles();
for(File packageFile : files) {
System.out.println(packageFile.getName());
if(packageFile.getName().endsWith(fileEnding)) {
packageFiles.add(packageFile);
}
}
}
return packageFiles.toArray(new File[]{});
Code:
file:/C:/path/to/module/dir/bin/modules/manager_database.jar!/net/server/modules/databasemanager
Also die Pfadangabe in der Ausgabe #1 ist völlig korrekt (der Pfad ist natürlich anders ). Nur hat Java irgendwie Probleme mir eine File-Referenz auf dieses Package zurück zu liefern.
Ich hatte mal ein Beispielprogramm geschrieben, wo dies auch normal ging, aber immer der gleiche ClassLoader vorhanden war. In diesem Beispiel ist es so, dass das Modul in einem URLClassLoader hängt und diese statische Funktion in dem normalen ClassLoader hängt, der vom System beim Aufruf genommen wird, hängt.
Mit getResourceAsStream kann ich leider nichts anfangen, weil ich ja nur das Package durchsuchen will nach bestimmten Dateien (in dem Fall Konfigurationsdateien).
Ich hoffe jemand weiß eine Lösung (wenn ich ein Package in dem gleichen Jar suche, wo diese Funktion ist, dann klappt es)
Gute Nacht KoMtuR