ERLEDIGT
NEIN
NEIN
ANTWORTEN
8
8
ZUGRIFFE
1396
1396
EMPFEHLEN
-
23.10.06 12:43 #1
- 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
-
23.10.06 13:27 #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:
...das wäre mal die dummy-Implementierung für den Fall, dass die Verschachtelung nicht größer als 1 (-> jar in jar) ist.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; } }
Gruß TomJava 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
-
23.10.06 13:43 #3
- 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.jarxxx.warxxx.jarxxx.jarxxx.jarxxx.jarxxx.jarxxx.jar
gruß
chrizmaster
-
23.10.06 14:03 #4
- 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....!
-
23.10.06 15:03 #5
- 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
-
23.10.06 15:26 #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ß TomJava 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
-
23.10.06 15:55 #7
- Registriert seit
- Oct 2006
- Beiträge
- 7
Besten Dank werd's mir mal anschauen!!
gruß
chrizmaster
-
24.10.06 16:33 #8
- 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
-
24.10.06 16:40 #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ß TomJava 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
-
Frage zu Manifest Datei für Jar-archiv
Von voodinator im Forum JavaAntworten: 4Letzter Beitrag: 02.09.10, 12:19 -
Den Pc nach Dateien durchsuchen
Von Andre im Forum Javascript & AjaxAntworten: 10Letzter Beitrag: 12.07.10, 15:45 -
Alle Dateien in Verzeichnissen nach String durchsuchen
Von Klein0r im Forum JavaAntworten: 3Letzter Beitrag: 08.09.08, 20:42 -
Ordner nach Dateien durchsuchen lassen?
Von heikoarndt im Forum .NET ArchivAntworten: 2Letzter Beitrag: 23.03.04, 12:47 -
html-Dateien nach skripten durchsuchen
Von faron im Forum PHPAntworten: 8Letzter Beitrag: 13.08.03, 18:40





Zitieren

Login





