Visualizzazione dei risultati da 1 a 10 su 16

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    24

    [JAVA] Problema Serializzazione su applicativo jar

    Salve a tutti avevo chiesto il vostro aiuto un po di tempo fa su un piccolo progetto per studiare java la creazione e gestione di un piccolo database...ora il progetto funziona perfettamente come voglio io, però quando esporto il tutto in file .jar se questo file lo carico su un altro pc (ho provato sia su sistemi ubuntu che windows) la mia applicazione parte ma quando cerco di aggiungere la prima voce al mio database (e quindi di creare il database che di partenza non esiste e poi di serializzarlo per salvarlo in memoria) il programma non fa niente penso sia un problema con la serializzazione, vi posto il codice della serializzazione e della deserilizzazione in attesa di vostri suggerimenti
    codice:
    package Archivio;
    import java.io.*;
    
    
    
    
    /**
     *Questa classe scrive su file serializzando un archivio di CD DVD e Libri
     */
    public class SerializzaArchivio {
        final String nomeFile="archivio.dat";
        
        public  SerializzaArchivio(Archivio archivio){
           
            ObjectOutputStream output;
            
            try{
                output = new ObjectOutputStream(new FileOutputStream(nomeFile)); 
                output.writeObject(archivio);
                output.close();
            }
             catch (FileNotFoundException e) 
            {
                System.out.println(e);
            } 
            
            catch (IOException e) {
                System.out.println(e);
            }
           }
    }
    codice:
    package Archivio;
    
    
    import java.io.*;
    
    
    /**
     * Questa classe legge da file e deserializza un archvio inserendo le voci in un archvio 
     */
    public class DeserializzaArchivio {
        private Archivio archivio;
        final String nomeFile="archivio.dat";
       
        /**
         * Costruttore della classe Deserializza Archivio
         */
        
        public DeserializzaArchivio(){
            
            try{
               ObjectInputStream input = new ObjectInputStream(new FileInputStream(nomeFile));
                archivio =(Archivio) input.readObject();
                input.close();
            }
            catch (FileNotFoundException e) 
            {
                System.out.println("");
            }
            
            catch (IOException e) {
                System.out.println(e);
            }
            catch (ClassNotFoundException e){
                System.out.println(e);
            }
           
        }
        public Archivio getArchivio(){
            return archivio;
        }
    }
    Ultima modifica di kekkuz87; 02-01-2014 a 16:27

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Avvialo da riga di comando e verifica eventuali eccezioni che possono essere sollevate.

    PS: Il nome del file l'hai codificato fisso nel sorgente e il percorso di tale file lo hai lasciato "al caso", ovvero alla working directory da cui viene avviata l'applicazione... anche questo andrebbe sistemato, perchè se la working directory non dovesse essere esattamente la directory del programma (e questo può capitare benissimo se l'applicazione viene lanciata con un doppio clic da un ambiente desktop), allora magari il file viene anche correttamente creato, ma tu non sai dove.

    Altra cosa da sistemare, quando si hanno blocchi try/catch per l'uso di file, sarebbe bene usare anche il costrutto finally, per assicurarsi le chiusure degli stream.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    24
    se eseguo da teminale ubuntu mi solleva questa eccezione
    codice:
    gcavina@gcavina-HP-G62-Notebook-PC:~/Scrivania$ java -jar ProgettoJava.jar 
    
    
    Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/itextpdf/text/DocumentException
    	at Archivio.PanelCD$PulsanteSalva.actionPerformed(PanelCD.java:233)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    	at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    	at java.awt.Component.processMouseEvent(Component.java:6505)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    	at java.awt.Component.processEvent(Component.java:6270)
    	at java.awt.Container.processEvent(Container.java:2229)
    	at java.awt.Component.dispatchEventImpl(Component.java:4861)
    	at java.awt.Container.dispatchEventImpl(Container.java:2287)
    	at java.awt.Component.dispatchEvent(Component.java:4687)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    	at java.awt.Container.dispatchEventImpl(Container.java:2273)
    	at java.awt.Window.dispatchEventImpl(Window.java:2719)
    	at java.awt.Component.dispatchEvent(Component.java:4687)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    	at java.awt.EventQueue.access$200(EventQueue.java:103)
    	at java.awt.EventQueue$3.run(EventQueue.java:694)
    	at java.awt.EventQueue$3.run(EventQueue.java:692)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    	at java.awt.EventQueue$4.run(EventQueue.java:708)
    	at java.awt.EventQueue$4.run(EventQueue.java:706)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    Caused by: java.lang.ClassNotFoundException: com.itextpdf.text.DocumentException
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    	... 38 more
    qualche suggerimento (Sono un neofita tutta quella roba mi ha spaventato)?? grazie comunque per l'aiuto

    PS quindi devo aggiungere tipo
    finally{
    output.close();
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da kekkuz87 Visualizza il messaggio
    se eseguo da teminale ubuntu mi solleva questa eccezione
    codice:
    gcavina@gcavina-HP-G62-Notebook-PC:~/Scrivania$ java -jar ProgettoJava.jar 
    
    Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/itextpdf/text/DocumentException
    Vuol dire che la libreria iText non è "in classpath". Siccome la applicazione la avvii facendo partire direttamente il jar, allora vuol dire che dentro il tuo jar, nel "manifest" ci deve essere l'attributo Class-Path che contiene un URL relativo al jar di iText, che ovviamente deve "viaggiare" insieme alla tua applicazione.


    Quote Originariamente inviata da kekkuz87 Visualizza il messaggio
    PS quindi devo aggiungere tipo
    finally{
    output.close();
    }
    Sì ma occhio ... close a sua volta può lanciare IOException.
    E in realtà, il fatto che hai gestito tutta la lettura nel costruttore non è comunque una bella cosa.
    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
    Registrato dal
    Dec 2013
    Messaggi
    24
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Vuol dire che la libreria iText non è "in classpath". Siccome la applicazione la avvii facendo partire direttamente il jar, allora vuol dire che dentro il tuo jar, nel "manifest" ci deve essere l'attributo Class-Path che contiene un URL relativo al jar di iText, che ovviamente deve "viaggiare" insieme alla tua applicazione.
    Perdonami ma riesci spiegarmi + o - come aggiungere questo attributo Class-Path....scusami sono proprio ancora poco capace con java

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da kekkuz87 Visualizza il messaggio
    Perdonami ma riesci spiegarmi + o - come aggiungere questo attributo Class-Path....scusami sono proprio ancora poco capace con java
    Nel manifest dovrai avere una riga del tipo:

    Class-Path: libs/itextpdf-X.Y.Z.jar

    Ovviamente puoi rinominare il jar togliendo la versione (sconsigliato comunque) o cambiare il path.

    Se usi libs/ vuol solo poi dire che nella (qualunque) directory dove hai ProgettoJava.jar, dovrai avere questa libs con dentro il jar.

    Ah, so che di iText quello non è l'unico jar, ce n'è uno per il "pdfa" e uno di "xtra", verifica se ti servono oppure no. Più path nell'attributo Class-Path vanno separati semplicemente con spazio (e occhio alla limitazione "pignola" dei 72 caratteri per riga).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Dire semplicemente "sul desktop" non è sufficiente: su un sistema vi possono essere più desktop, almeno uno per utente, se il desktop è previsto... se non è previsto un sistema grafico molto probabilmente non c'è nemmeno un desktop.
    Di questo devi tenere conto.

    E' più facile, piuttosto, fare riferimento alla directory "home" dell'utente o alla directory dove risiede il programma (o una sua sub-directory).

    Per ottenere la "home" dell'utente, c'è un'apposita property di sistema:

    codice:
    String pathHomeUtente = System.getProperty("user.home");

    Per ottenere la directory dell'applicazione puoi chiamare questo metodo all'interno di una tua classe:

    codice:
    String appDir = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath()).getParent();

    (mai provato, ma dovrebbe funzionare)


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Per ottenere la directory dell'applicazione puoi chiamare questo metodo all'interno di una tua classe:

    codice:
    String appDir = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath()).getParent();
    Non ho mai visto (ne usato, quindi) una cosa del genere. Però getLocation() ritorna un URL che immagino (per file su file-system) che sia con il file: protocol. Quindi ipotizzerei di trasformarlo in URI con toURI() e poi passare questo al costruttore di File.
    Ovviamente Lele, è tutta una ipotesi ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Sì, beh... sono andato molto a memoria di una cosa che avevo visto su SO, può essere che abbia scritto una castroneria... un metodo che uso e che funziona è questo:

    codice:
        private String getMyPath() {
            String str = getClass().getResource("NomeClasse.class").toExternalForm();
    
            int start = 0;
            int end = str.indexOf("NomeDelJar.jar");
            if ( str.startsWith("jar:") ) {
                start = 4;
            }
    
            if (str.indexOf("file:/") >= 0) {
                start += 6;
            }
            
            str = str.substring(start, end);
            str = str.replaceAll("%20", " ");
    
            return str;
        }

    Dove NomeClasse.class è il nome di una classe dell'applicazione e NomeDelJar.jar è il nome del file JAR che contiene l'applicazione... questo codice va adeguato alle situazioni: se, ad esempio, il JAR dell'applicazione è all'interno di una sub-directory, allora va adeguato di conseguenza il nome del jar, apponendovi davanti il nome della sub-directory. Insomma, ce la si gioca un po'.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2026 vBulletin Solutions, Inc. All rights reserved.