ERLEDIGT
NEIN
NEIN
ANTWORTEN
2
2
ZUGRIFFE
304
304
EMPFEHLEN
-
27.01.12 13:07 #1
Hi zusammen,
ich versuche zur Zeit einen ClassLoader zu schreiben, der Klassen aus einer Jar-Datei laden kann, die innerhalb einer Jar-Datei liegt.
Die Struktur einer solchen Jar-Datei kann wie folgt aussehen:
Bei meinem Beispiel, stellen die Dateien Jar1-3 eine Library (z.B. commons-io, etc.) dar. Diese Libaray - oder nur eine bestimmte Klasse daraus - will ich nun in die Laufzeitumgebung laden. Das ist schwieriger als es vielleicht klingt.Code :1 2 3 4 5 6 7 8
+ Jar # package/package/package # package/package # package/package/package/package # META-INF/ # Jar1 # Jar2 # Jar3
Ich hab mir erstmal ein JUnit-Test dafür angelegt:
Vielleicht hat jemand von euch ja einen genialen Einfall dazu. Würde mich freuen.Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
public class JarClassLoaderTest extends TestCase { private static final File jarFile = new File("./Tests/Test.jar"); private final URL jarFileUrl; private final JarURLConnection con; /** * @throws Exception */ public JarClassLoaderTest() throws Exception { jarFileUrl = new URL("jar:file:" + jarFile.getAbsolutePath() + "!/"); con = (JarURLConnection) jarFileUrl.openConnection(); con.connect(); System.out.println("Connected to JarFile="+jarFileUrl.getPath()); } /** @throws Exception */ public void testLoadJars() throws Exception { final URLJarFile j = (URLJarFile) con.getContent(); System.out.println(j.getName()); final List<JarEntry> jarFiles = filterJarFiles(j.entries()); for(final JarEntry jarEntry : jarFiles) { System.out.println(jarEntry.getName()); if(jarEntry.getName().startsWith("commons-io")) { final URL innerJarFileUrl = new URL("jar:"+jarFileUrl.getPath()+jarEntry.getName()); System.out.println(innerJarFileUrl); final ClassLoader cl = new URLClassLoader(new URL[] {innerJarFileUrl}, this.getClass().getClassLoader()); final Class<?> loadClass = Class.forName("org.apache.commons.io.IOUtils", true, cl); } } } /** * @param entries * @return */ private List<JarEntry> filterJarFiles(final Enumeration<JarEntry> entries) { final List<JarEntry> jarList = new ArrayList<JarEntry>(); while(entries.hasMoreElements()) { final JarEntry je = entries.nextElement(); final String name = je.getName(); if(name.endsWith(".jar")) { jarList.add(je); } } return jarList; } }

ps.: Um zu überprüfen, dass die Klasse/Jar nicht schon vorher geladen wurde, habe ich der VM folgenden Parameter '-verbose:class' übergeben. Dadurch bekommt man alle geladenen/geöffneten Klassen/Jars angezeigt.
Gruß
FabioBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
27.01.12 13:11 #2
- Registriert seit
- Jun 2009
- Beiträge
- 870
Sollte der Standard-Classloader nicht genau das können, was du möchtest? Eclipse packt ja auch auf Wunsch Jar-Archive in die generierten Jar-Archive.
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
27.01.12 13:46 #3
Das sollte man eigentlich meinen, dass der das kann.
Das oberste Jar ist bei mir ein Executable-Jar. Wenn ich das aufrufe, dann will ich mithilfe des ClassLoaders Klassen aus den inneren Jars laden. So zumindest mein Plan.
// EDIT:
Da es mir gerade eben aufgefallen ist. Die "inneren" Jar-Dateien liegen auch im Class-Path der Jar. Gibt es nicht eine Möglichkeit, evtl. sogar einfach nur die Jars - die im Class-Path liegen - auf die "inneren" Jar-Dateien zeigen zu lassen. Sodass ich mich gar nicht um den ClassLoader etc. kümmern muss?Geändert von Fabio Hellmann (27.01.12 um 14:34 Uhr)
Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
Ähnliche Themen
-
Basisklasse, 2 Klassen in einer Datei definieren
Von Jejune im Forum C/C++Antworten: 4Letzter Beitrag: 19.04.10, 16:55 -
Laden einer Datei an einer bestimmten Stelle
Von pontifex im Forum PHPAntworten: 1Letzter Beitrag: 17.12.05, 12:51 -
Laden einer Klasse aus .as Datei
Von Saiya-Gin im Forum Flash PlattformAntworten: 2Letzter Beitrag: 10.03.05, 16:28 -
Speichern und Laden einer TXT Datei!
Von Eichhornleib im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 19.12.04, 18:42 -
[MX] Laden einer XML-Datei
Von fungo im Forum Flash PlattformAntworten: 12Letzter Beitrag: 20.05.03, 17:37





Zitieren
Login





