# Eclipse RCP Applikation: Dynamisch .jar Libaries laden



## r3zn1k (22. April 2009)

Guten Tag

Ich wusste nicht in welches Unterforum ich mit diesem Thread hinsollte, darum poste ich es einfach mal hier

Das man die JAR-Dateien im "manifest.mf" unter *Bundle-ClassPath* angeben kann weiss ich. Jedoch habe ich das Problem das ich weder die Anzahl noch den Namen der JAR-Dateien kenne.

Ich kenne lediglich Verzeichnis, in dem sich die Libraries befinden.
Ich möchte alle diese Libraries aus diesem Verzeichnis in einem Plugin laden, um sie über Wrapper-Klassen anderen Plugins zur verfügung stellen zu können.

Nun lautet meine *Frage:*
Wie kann ich alle Libraries aus einem Verzeichnis laden, damit sie das Plugin, in dem sie geladen werden, kennt?

Vielen Dank für eure Hilfe!


----------



## zeja (22. April 2009)

Über einen URLClassLoader würde das gehen. Ich weiß aber natürlich nicht genau was du vorhast.


----------



## r3zn1k (23. April 2009)

Das habe ich auch schon probiert. Bis jetzt bin ich jedoch erst soweit:


```
protected static void loadClasses() {
		File libDir = getLibDir();
		if (libDir == null)
			return;
		
		ArrayList<URL> urls = new ArrayList<URL>();
		for (String file : libDir.list()) {
			if (file.endsWith(".jar")) {
				try {
					urls.add(new URL("jar", "", "file:" + new File(file).getAbsolutePath() + "!/"));
				} catch (MalformedURLException e) {
					Logger.getLogger(Test.class).error("Couldn't add " + file + " to the library-list", e);
				}
			}
		}

		URLClassLoader classLoader = URLClassLoader.newInstance(urls.toArray(new URL[] {}));	
		
		String clazz = "xxx.AnyClass";
		try {
			classLoader.loadClass(clazz);
		} catch (ClassNotFoundException e) {
			Logger.getLogger(Test.class).error("Couldn't load class " + clazz, e);
		}
		
	}
```

*classLoader.loadClass(clazz)* wirft eine java.lang.ClassNotFoundException.


----------



## zeja (23. April 2009)

URLs nach möglichkeit nicht selber konstruieren. In deinem Fall
file.toURI().toURL()


----------



## Oliver Gierke (23. April 2009)

Was halt grundsätzlich suspekt ist, dass du Eclipse RCP (und damit einen OSGi Container) benutzt und dann irgendwelchen Classloaderfoo machen willst. IMHO ist es an der Stelle Zeit, nen Schritt zurück zu machen und zu überlegen, was das eigentlich Ziel ist, was du erreichen willst. Warum willst du beliebige JAR's laden? Warum nutzt du nicht das Extenderpattern um beim deployen eines Bundles in den OSGi Container darauf zu reagieren.

Grundsätzlich: was hast du vor? 

Gruß
Ollie


----------



## Thomas Darimont (23. April 2009)

Hallo,



> Was halt grundsätzlich suspekt ist, dass du Eclipse RCP (und damit einen OSGi Container) benutzt und dann irgendwelchen Classloaderfoo machen willst. IMHO ist es an der Stelle Zeit, nen Schritt zurück zu machen und zu überlegen, was das eigentlich Ziel ist, was du erreichen willst. Warum willst du beliebige JAR's laden? Warum nutzt du nicht das Extenderpattern um beim deployen eines Bundles in den OSGi Container darauf zu reagieren.



So abwegig ist das IMHO nicht. Stell dir doch nur mal vor du baust einen generischen Datenbank-Client als Eclipse RCP Anwendung. Dort willst du dann vielleicht die JDBC Treiber jars dynamisch in der Anwendung angeben können.

Gruß Tom


----------



## Oliver Gierke (23. April 2009)

Das ist durchaus richtig. Aber die initiale Aussage war, einen Ordner voll JARs laden zu wollen, was für mich nach einer Art Pluginsystem klingt. Da aber mit OSGi schon eines da ist, glaub ich dass es sinn machen kann, wie man genau das darüber abbildet. Ob das jetzt wirklich so ist, hängt davon ab, was r3zn1k genau vorhat, deswegen meine Frage.

REINHAUN!


----------



## smo6 (25. August 2009)

Wie sieht es denn aktuell in der Thematik aus? Hab nämlich ein ähnliches Problem.
@r3zn1k: Hast du das Problem jetzt gelöst oder wie schauts aus?


----------

