tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
304
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    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:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    + Jar
      # package/package/package
      # package/package
      # package/package/package/package
      # META-INF/
      # Jar1
      # Jar2
      # Jar3
    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.

    Ich hab mir erstmal ein JUnit-Test dafür angelegt:
    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;
        }
    }
    Vielleicht hat jemand von euch ja einen genialen Einfall dazu. Würde mich freuen.

    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ß

    Fabio
     
    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.

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    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

  1. Antworten: 4
    Letzter Beitrag: 19.04.10, 16:55
  2. Antworten: 1
    Letzter Beitrag: 17.12.05, 12:51
  3. Laden einer Klasse aus .as Datei
    Von Saiya-Gin im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 10.03.05, 16:28
  4. Speichern und Laden einer TXT Datei!
    Von Eichhornleib im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 19.12.04, 18:42
  5. [MX] Laden einer XML-Datei
    Von fungo im Forum Flash Plattform
    Antworten: 12
    Letzter Beitrag: 20.05.03, 17:37