Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132

    Estrarre i nomi dei package in un file jar.

    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.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Estrarre i nomi dei package in un file jar.

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

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Scusa ma che cosa è il file manifest?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mainetz
    Scusa ma che cosa è il file manifest?
    È 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....

    JAR Manifest
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    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

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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
    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.

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    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!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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!
    Ma non devi "rimuoverli", basta solo fare una iterazione sul Set.

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Grazie mille!!!

    E' stato davvero utilissimo!

    Ho una domanda.

    Enumeration<? extends ZipEntry> quella cosa tra parentesi angolari che cosa significa??

    Grazie mille!

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mainetz
    Enumeration<? extends ZipEntry> quella cosa tra parentesi angolari che cosa significa??
    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.