Klassendatei finden

Vereth

Erfahrenes Mitglied
Besteht die Möglichkeit, irgendwie herauszufinden, in welchem Verzeichnis eine class- oder jar-Datei ist, die eine bestimmte Klasse beherbergt?
 
jein.

du musst wissen, wo deine Klasse rumliegt und kannst sie dann reinladen. Der Classloader verrät Dir nicht, wo eine Klasse liegt.

Du kannst aber eine Instanz nachladen, wenn Du weisst, wo Deine Klassen liegen.

Ich hatte mal das Problem, alle Klassen eines Packages vom CL zu bekommen. Das hat nicht geklappt. Die klasse selbst (also das bean bei mir) weiss auch nix von seinem Standort. Deswegen habe ich die Dinger einfach nachgeladen und dann zerpflückt.

Java:
	public Collection<Class<?>> getAllClassesFromPath(String path) throws MalformedURLException, Exception {
		Collection <File> classes = new FileUtil().listAllClassFiles(path) ;
		Collection<Class<?>> result = new ArrayList<Class<?>>(classes.size());
		URL urls[] = new URL[1];
		
		if (!path.endsWith(File.separator)) {
			path +=File.separator;
		}
		urls[0] = (new File(path)).toURI().toURL();
					
		URLClassLoader ucl = new URLClassLoader(urls);

		for (File classFile : classes) {			
			String classFilePath = classFile.getAbsolutePath().replace(path, "").replace(".class", "").replace(File.separator, ".");
			if (classFilePath.startsWith(".")) {
				classFilePath = classFilePath.substring(1);
			}			
			try {
				result.add(ucl.loadClass(classFilePath));
			}catch(Exception ex) {
				log.error("WARNING : COULD NOT LOAD "+classFilePath+" LOCATED AT "+classFile.getAbsolutePath()+" REASON : "+ex.getMessage());
				throw ex;
			}
		}
			
		
		return result;
		
		
		
	}
 
Eine interessante Anregung, aber das hilft mir nicht wirklich weiter. Ich möchte die Klassen einer JAR-Datei nachladen, deren relativen Pfad zu meiner Haupt-JAR-Datei ich kenne bzw. festlege. Kann ich dann z.B. "./lib" verwenden, ist also "." immer das Verzeichnis meiner JAR-Datei, oder ist es das Arbeitsverzeichnis des Users?
 
Hi!
Kann es bei mir gerade nicht ausprobieren, aber probiere es doch mal auf diesem Wege:
Java:
YourClass.class.getProtectionDomain().getCodeSource().getLocation();

*grüssle*
 
Großartig, scheint zu funktionieren. Jetzt muss ich nur noch herausfinden, wie ich die Klassen der JAR-Datei 'von Hand' nachlade, um sie zur Verfügung zu haben.
 
*notier* jo, das ist klasse.

Du kannst den o.a. Classloader-Call nehmen, um die Klasse nachzuladen.


Java:
    final URL extLibUrl = new URL("file", "localhost", file.getAbsolutePath());
    URLClassLoader loader = new URLClassLoader(new URL[]{extLibUrl});
    loader.class("foo.batz");
 
Warum packst du die benötigten Jars nicht einfach in deine Hauptjar mit rein? Und erstellst eine Runable Jar.

Ich weiß nicht ob ich dich ganz richtig verstanden habe. Du hast wahrscheinlich etwas entwickelt was Externe Jars verwendet. und wenn du das ganze zu einer Jar packst dann fehlen dir die funktionen der externen Jar's oder?

Also bei Eclipse wenn man die Bibliotheken per
Build Path -> configeure Bild Path -> Add external Jar's
Externe Jar's hinzufügt und anschließend von seinem Programm eine Runable Jar erstellt werden die externen Jar's automatisch mitgepackt.
Vielleicht hilfts
Grüße
Anton
 
Zurück