Ciao a tutti!
Ho un problema.
Dovrei poter analizzare un file .jar ed estrarre i package al suo interno per poterli salvare in un database.
Qualcuno sa come posso fare??
Grazie mille!
mainetz.
Ciao a tutti!
Ho un problema.
Dovrei poter analizzare un file .jar ed estrarre i package al suo interno per poterli salvare in un database.
Qualcuno sa come posso fare??
Grazie mille!
mainetz.
Puoi usare le classi del package java.util.zip o java.util.jar. Per quello che devi fare è indifferente. Il package java.util.jar in più è in grado di trattare un "manifest" e i suoi attributi.Originariamente inviato da mainetz
Dovrei poter analizzare un file .jar ed estrarre i package al suo interno per poterli salvare in un database.
Qualcuno sa come posso fare??
Avevo già fatto un esempio per la estrazione dei file da uno zip in questa tua discussione.
A te basta solo leggere i nomi dei file. Appena trovi un file .class, ne prendi il path e quello forma poi il package. Es. com/pippo/pluto.class il package è com.pippo
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
È un file di testo particolare che nel jar si chiama MANIFEST.MF nella directory META-INF ed è suddiviso in sezioni che contengono attributi che possono indicare ad esempio il classpath, la "main" class, la versione ecc....Originariamente inviato da mainetz
Scusa ma che cosa è il file manifest?
JAR Manifest
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Mi spiego meglio...
Io avevo ovviato il problema cercando tutte le entry terminino con .class e prendendo il path di quel file ho esattamente il package. Il problema è che se il package contiene molti (parlo anche di qualche migliaia) di file .class devo fare in modo che il package venga scritto solo una volta nel database. Allora ho pensato di utilizzare uno stack aggiungere un package alla volta, controllando che non sia già presente nello stack, e alla fine fare l'upload di tutti i package. Solo che questa operazione richiede molto in termini di tempo... Cercavo un metodo un po' più rapido....
Grazie mille!!!
mainetz
Usa un Set. Per ogni file prendi subito il suo path (questo è facile, se hai un oggetto File, usi getParent o getParentFile) e lo metti nel Set. Nel Set non ci possono essere duplicati. Se aggiungi un valore che c'è già, il Set se ne frega.Originariamente inviato da mainetz
devo fare in modo che il package venga scritto solo una volta nel database. Allora ho pensato di utilizzare uno stack aggiungere un package alla volta, controllando che non sia già presente nello stack
Alla fine fai una iterazione sul Set e dai path ti componi i package. Se non hai bisogno di un ordine particolare, usa HashSet. Se li vuoi ordinati, usa TreeSet.
P.S. Tra HashSet e TreeSet ci sono differenze nelle performance, perché TreeSet è un albero mentre HashSet è una hash-table. La scelta sarebbe da valutare.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Grazie mille dell'idea adesso devo capire come posso una volta popolato il set rimuovere uno ad uno gli elementi per fare l'update nel db!
Grazie di nuovo!!!
mainetz!
Ma non devi "rimuoverli", basta solo fare una iterazione sul Set.Originariamente inviato da mainetz
adesso devo capire come posso una volta popolato il set rimuovere uno ad uno gli elementi per fare l'update nel db!
Io comunque ho provato a scrivere il programma per estrarre la lista dei package. Ecco il sorgente:
codice:import java.io.*; import java.util.*; import java.util.zip.*; public class JarPackages { public static void main (String[] args) { if (args.length == 1) { try { Set<String> set = readPackages (args[0]); for (String s : set) System.out.println (s); } catch (Exception e) { System.out.println (e); } } else System.out.println ("Usage: java JarPackages <jarfile>"); } public static Set<String> readPackages (String zipFilename) throws IOException { ZipFile zipFile = new ZipFile (zipFilename); Set<String> foldersSet = new HashSet<String> (); try { Enumeration<? extends ZipEntry> entriesEnum = zipFile.entries (); while (entriesEnum.hasMoreElements ()) { ZipEntry zipEntry = entriesEnum.nextElement (); if (!zipEntry.isDirectory ()) { String entryName = zipEntry.getName (); if (entryName.endsWith (".class")) { File entryFile = new File (entryName); foldersSet.add (entryFile.getParent ()); } } } } finally { zipFile.close (); } TreeSet<String> packagesSet = new TreeSet<String> (); for (String pkg : foldersSet) packagesSet.add (pkg.replace (File.separator, ".")); return packagesSet; } }
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Grazie mille!!!
E' stato davvero utilissimo!
Ho una domanda.
Enumeration<? extends ZipEntry> quella cosa tra parentesi angolari che cosa significa??
Grazie mille!
Vuoi la risposta breve o quella lunga?? La breve: è una questione legata ai "generics". Quella espressione serve per definire un "bound" (limite) su ciò che può essere il tipo parametrico. Nel caso sopra è un "upper bound": il tipo parametrico della Enumeration non si sa a priori quale sia però si è sicuri che certamente sarà di tipo ZipEntry o di una sua sottoclasse.Originariamente inviato da mainetz
Enumeration<? extends ZipEntry> quella cosa tra parentesi angolari che cosa significa??
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet