# Reflection funktioniert nicht in Jar



## nesapio (14. Jan 2009)

Hallo,
ich möchte per Reflection unterschiedliche DiagrammTypen lesen, die der User dann auswählen kann. Aus Eclipse funktioniert soweit alles bestens, aber wenn ich per Ant-Skript ein jar erstelle, dann funktioniert die Reflection nicht mehr.

Den Code häng ich unten an.

Der Pfad wird dabei aus dem paketnamen generiert und dann zu einer URL umgeformt. Über die URL wird dann der Ordner bestimmt und geöffnet, so dass daraus (eigentlich) die Diagramme geladen werden können.

Aus Eclipse sieht der Pfad wie folgt aus:
file:/C:/workspace/foo/bin/de/for/pimp/gui/result/panes/availablediagrams

Und beim Jar so:
jar:file:/C:/workspace/foo/jar/PerMoTo_0.91_Beta.jar!/de/for/pimp/gui/result/panes/availablediagrams

Im Jar ist der Ordner mit den Klassen mit drin, daran kann es also nicht liegen.
Eine Reflection die in einer Klasse der JAIDA Paketes stattfindet funktioniert ebenfalls nicht, also wäre ich auch für grundlegende Anregungen dankbar.


```
private String[] getDiagrams() throws ClassNotFoundException {

		logger.info("Available diagrams are found and listed!");

		// ArrayList<Class> classes = new ArrayList<Class>();
		ArrayList<String> classesAsString = new ArrayList<String>();
		File directory = null;

		try {
			ClassLoader loader = Thread.currentThread().getContextClassLoader();
			if (loader == null) {
				logger.info("loader is null");
				throw new ClassNotFoundException();
			}
			String path = packageName.replace('.', '/');
			logger.info(path);
			// String path = packageName.replace('.', '\'); //für linux
			URL url = loader.getResource(path);
			logger.info(url);
			if (url == null) {
				logger.info("url is null");
				throw new ClassNotFoundException();
			}
			directory = new File(url.getFile());
		} catch (Exception e) {
			// e.printStackTrace();
			throw new ClassNotFoundException();
		}

		if (directory.exists()) {
			String[] files = directory.list();
			boolean enthaeltDolarZeichen = false;
			
			for (int i = 0; i < files.length; i++) {
				if (files[i].endsWith(".class")) {
					
					for(int k=0; k<files[i].length(); k++){
						if(files[i].charAt(k) == '$'){
							enthaeltDolarZeichen = true;
							continue;
						}
					}
					if(!enthaeltDolarZeichen){
						String nameOfDiagram = files[i].substring(0, files[i]
							.length() - 6);
						classesAsString.add(nameOfDiagram);
					}							
				}
				enthaeltDolarZeichen = false;
			}
		}
		String[] diagrams = new String[classesAsString.size()];
		classesAsString.toArray(diagrams);

		return diagrams;
	}
```


----------



## Ebenius (14. Jan 2009)

"funktioniert nicht" ist immer schlecht. Besser ist: Ich habe die XYZException mit der Message "XYZ are three characters" bekommen, nachdem ich meinen Computer vom Balkon geworfen habe. Der StackTrace der Exception ist dieser:
	
	
	
	





```
...
```

Ebenius


----------



## Wildcard (14. Jan 2009)

In einem Jar gibt es keine Verzeichnisse und keine Dateien. Es gibt nur Jar Entries. Mit der File API brauchst du also gar nicht erst anzufangen, das geht so nicht.


----------



## nesapio (14. Jan 2009)

Wildcard hat gesagt.:
			
		

> In einem Jar gibt es keine Verzeichnisse und keine Dateien. Es gibt nur Jar Entries. Mit der File API brauchst du also gar nicht erst anzufangen, das geht so nicht.



Danke für den Hinweis.

Wie geht es denn? Ich habe keine Ahnung wie ich anders den Ordner/jarEintrag auslesen soll. Was gibt es da für Möglichkeiten? Beispielcode wäre ein Traum.




> "funktioniert nicht" ist immer schlecht. Besser ist: Ich habe die XYZException mit der Message "XYZ are three characters" bekommen, nachdem ich meinen Computer vom Balkon geworfen habe. Der StackTrace der Exception ist dieser



zeile 30 die If Abfrage da liefert directory.exists() false zurück, weswegen kein Fehler auftritt, aber eben auch die Feiles nicht gefunden werden können. Ohne diese kann ich aber JList für die Oberfläche nicht generieren und somit auch die Diagramme nicht aufrufen.


----------



## musiKk (15. Jan 2009)

nesapio hat gesagt.:
			
		

> Wie geht es denn? Ich habe keine Ahnung wie ich anders den Ordner/jarEintrag auslesen soll.


Der Hinweis mit den Jar Entries war schon wörtlich zu nehmen. Nur das Leerzeichen muss raus.  Es gibt in der API die Klassen JarFile und JarEntry, damit sollte schon einiges gehen.


----------



## Wildcard (15. Jan 2009)

Wenn du tatsächlich alle Klassen auslesen willst die *ungepackt* in Verzeichnis XY liegen, dann musst du entweder die Pfade der Jar Entries parsen (denn ein zip/jar ist immer flach, eine Liste von Einträgen), oder eine externe Bibliothek wie TrueZip verwenden. Davon würde ich allerdings eher abraten wenn nicht unbedingt nötig.


----------

