tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1396
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    cHrIzMaStEr cHrIzMaStEr ist offline Rookie
    Registriert seit
    Oct 2006
    Beiträge
    7
    Hallo und Guten Tag,

    ich habe folgendes Problem:

    Ich habe irgendwo auf dem Dateisystem ein .jar Archiv liegen (z.B. test.jar). Diese Archiv enthält weitere .jar Archive (oder auch .war - z.B. 1.jar / 2.jar / 3.war / ...) und natürlich den META-INF/MANIFEST.MF Ordner mit der Manifest Datei.
    Die Ausgabe dieser ersten Manifest Datei (aus test.jar) ist auch kein Problem, allerdings möchte ich auf alle Manifest Dateien der Jar Archive innerhalb des test.jar Archivs zugreifen, also auch auf die Manifest Dateien aus den .jar Archiven (1.jar / 2.jar / 3.war / ...) die im ersten Archiv (test.jar) enthalten sind!

    Leider bekomme ich das nur hin, wenn ich erst jedes Archiv entpacke und dann auf dem Dateisystem nach der MANIFEST.MF suche.... Gibt es eine Möglichkeit ohne jedes Archiv zu entpacken auf die Dateien zuzugriefen!! Dazu müsste ich ja quasi beim rekursiven Aufruf der Methode welche die JAR Einträge auflistet, die jeweilig akutelle Datei angeben (also 1.jar / 2.jar / 3.war / ...) Oder!?

    Vlt könnt ihr mir ja helfen oder mir sagen das es nur funktioniert wenn man das Archiv entpackt

    Gruß und Danke schonmal...
    chrizmaster
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Eine Möglichkeit sähe so aus:
    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
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    import java.util.jar.JarInputStream;
    import java.util.jar.Manifest;
     
    /**
     * @author Thomas.Darimont
     */
    public class JarFileAnalyzer {
     
      /**
       * @param args
       */
      public static void main(String[] args) throws Exception {
        JarFile jarFile = new JarFile("c:/tmp/commons.jar");
        List<Manifest> manifests = lookForManifestFiles(jarFile, true);
        for (Manifest manifest : manifests) {
          System.out.println(manifest.getMainAttributes().getValue("Implementation-Title"));
        }
     
      }
     
     
      private static List<Manifest> lookForManifestFiles(JarFile jarFile, boolean pseudoRecursive) throws Exception {
        List<Manifest> manifests = new ArrayList<Manifest>();
        manifests.add(jarFile.getManifest());
        if (pseudoRecursive) {
          Enumeration<JarEntry> jarEntries = jarFile.entries();
          while (jarEntries.hasMoreElements()) {
            JarEntry jarEntry = jarEntries.nextElement();
            if (jarEntry.getName().toLowerCase().matches(".*\\.jar$")) {
              JarInputStream jarInputStream = new JarInputStream(jarFile.getInputStream(jarEntry));
              manifests.add(jarInputStream.getManifest());
              jarInputStream.close();
            }
          }
        }
     
        return manifests;
      }
    }
    ...das wäre mal die dummy-Implementierung für den Fall, dass die Verschachtelung nicht größer als 1 (-> jar in jar) ist.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    cHrIzMaStEr cHrIzMaStEr ist offline Rookie
    Registriert seit
    Oct 2006
    Beiträge
    7
    Danke schonmal für die schnelle Antwort... werde mir das gleich mal anschauen und versuchen umzusetzen...!

    Leider kann es aber sein, das die Verschachtelung noch tiefer geht....

    z.B.

    xxx.jar
    xxx.war
    xxx.jar
    xxx.jar
    xxx.jar
    xxx.jar
    xxx.jar
    xxx.jar

    gruß
    chrizmaster
     

  4. #4
    cHrIzMaStEr cHrIzMaStEr ist offline Rookie
    Registriert seit
    Oct 2006
    Beiträge
    7
    Gut, habs bissl auf mein Programm umgebaut und das klappt soweit schonmal...! DANKE!

    nur das er noch tiefer geht....!
     

  5. #5
    cHrIzMaStEr cHrIzMaStEr ist offline Rookie
    Registriert seit
    Oct 2006
    Beiträge
    7
    Oder gibt es eine Möglichkeit von JarEntry zu JarFile zu konvertieren!!

    Dann könnte man der Methode welche das JarFile übergeben kriegt und die Entry's ausließt, dass akutelle Entry als JarFile beim rekursiven Aufruf übergeben....!?

    mhhh oder gibt es noch eine andere Möglichkeit...!!

    gruß und danke
    chrizmaster
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    schau mal hier:
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    import java.util.jar.JarInputStream;
    import java.util.jar.Manifest;
     
    /**
     * @author Thomas.Darimont
     */
    public class JarFileAnalyzer {
     
      /**
       * @param args
       */
      public static void main(String[] args) throws Exception {
        JarFile jarFile = new JarFile("c:/tmp/base.jar");
        List<Manifest> manifests = lookForManifestFiles(jarFile, true);
        for (Manifest manifest : manifests) {
          System.out.println(manifest.getMainAttributes().getValue("Implementation-Title"));
        }
     
      }
     
     
      private static List<Manifest> lookForManifestFiles(JarFile jarFile, boolean recursive) throws Exception {
        List<Manifest> manifests = new ArrayList<Manifest>();
        manifests.add(jarFile.getManifest());
        if (recursive) {
          Enumeration<JarEntry> jarEntries = jarFile.entries();
          while (jarEntries.hasMoreElements()) {
            JarEntry jarEntry = jarEntries.nextElement();
            if (jarEntry.getName().toLowerCase().matches(".*\\.(jar|war)$")) {
              System.out.println("nested jarEntry: " + jarEntry.getName());
              JarInputStream jarInputStream = new JarInputStream(jarFile.getInputStream(jarEntry));
              manifests.add(jarInputStream.getManifest());
              lookForManifestFilesInNestedJarEntry(jarInputStream, manifests);
              jarInputStream.close();
            }
          }
        }
     
        return manifests;
      }
     
     
      private static void lookForManifestFilesInNestedJarEntry(JarInputStream jarInputStream,
        List<Manifest> manifests) throws Exception {
        JarEntry nestedJarEntry = null;
        while ((nestedJarEntry = jarInputStream.getNextJarEntry()) != null) {
          if (nestedJarEntry.getName().toLowerCase().matches(".*\\.(jar|war)$")) {
            System.out.println("nested jarEntry: " + nestedJarEntry.getName());
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            int len = 0;
            byte[] buffer = new byte[32768];
            while ((len = jarInputStream.read(buffer)) > 0) {
              byteArrayOutputStream.write(buffer, 0, len);
            }
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            JarInputStream nestedJarInputStream = new JarInputStream(byteArrayInputStream);
            manifests.add(nestedJarInputStream.getManifest());
            lookForManifestFilesInNestedJarEntry(nestedJarInputStream, manifests);
            nestedJarInputStream.close();
          }
          jarInputStream.closeEntry();
        }
      }
     
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    nested jarEntry: inner.jar
    nested jarEntry: innerinner.jar
    nested jarEntry: innerinnerinner.war
    base
    inner
    innerinner
    innerinnerinner

    Gruß Tom
    Angehängte Dateien Angehängte Dateien
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    cHrIzMaStEr cHrIzMaStEr ist offline Rookie
    Registriert seit
    Oct 2006
    Beiträge
    7
    Besten Dank werd's mir mal anschauen!!

    gruß
    chrizmaster
     

  8. #8
    cHrIzMaStEr cHrIzMaStEr ist offline Rookie
    Registriert seit
    Oct 2006
    Beiträge
    7
    Hallo, ich nochmal....

    also habs soweit eingebunden und bissl verändert und läuft alles bestens! Nochmal zum Verständnis, wozu die folgenden Zeilen da sind:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    ...
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    int len = 0;
    byte[] buffer = new byte[32768];
    while ((len = jarInputStream.read(buffer)) > 0) {
    byteArrayOutputStream.write(buffer, 0, len);
    }
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
    JarInputStream nestedJarInputStream = new JarInputStream(byteArrayInputStream
    ...

    Wozu dient der ByteArrayInput/OutputStream

    gruß
    chrizmaster
     

  9. #9
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Damit entpacke ich die genesteten Jars temporär in den Speicher... du wolltest sie ja nicht auf der Platte haben, jedoch müssen sie zum Untersuchen eben entpackt werden. Also vorsicht damit

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Frage zu Manifest Datei für Jar-archiv
    Von voodinator im Forum Java
    Antworten: 4
    Letzter Beitrag: 02.09.10, 12:19
  2. Den Pc nach Dateien durchsuchen
    Von Andre im Forum Javascript & Ajax
    Antworten: 10
    Letzter Beitrag: 12.07.10, 15:45
  3. Antworten: 3
    Letzter Beitrag: 08.09.08, 20:42
  4. Ordner nach Dateien durchsuchen lassen?
    Von heikoarndt im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 23.03.04, 12:47
  5. Antworten: 8
    Letzter Beitrag: 13.08.03, 18:40