Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Stranezze dei file jar

  1. #1

    Stranezze dei file jar

    salve a tutti, scrivo in questo forum per la prima volta.

    mi chiedevo se qualcuno potesse spiegarmi lo strano comportamento del file .jar che ho creato con eclipse.

    in pratica, al momento dell'apertura l'applicazione recupera dai dati da un database per popolare delle JComboBox. Tale database (creato con HSQLDB) si trova in una cartella "a fianco" al file .jar in questione. Ossia, c'è una cartella A che contiene il '.jar' e la cartella 'db' del database.
    Se lancio l'applicazione da shell (il mio OS è linux-Ubuntu) con il classico java -jar file.jar tutto funziona alla perfezione.
    Se lancio l'applicazione facendo doppio click sull'icona del jar, l'applicazione parte ma non si connette al database.

    Non capisco perché questo comportamento: da shell ok, da finestra no. e il file è lo stesso!

    Qualcuno ha qualche idea?

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

    Re: Stranezze dei file jar

    Originariamente inviato da faabiioo
    Non capisco perché questo comportamento: da shell ok, da finestra no. e il file è lo stesso!

    Qualcuno ha qualche idea?
    Come è specificato/referenziato nel programma questo db? Con un path relativo? Allora la specifica ... è "relativa" alla directory corrente.
    Se lanci da prompt è evidente quale sia la directory "corrente" (è quella in cui sei). Facendo doppio click sul jar in teoria la directory "corrente" dovrebbe essere "la directory del jar".

    Comunque la questione è banale: 1) Come è referenziato il db e 2) quale è la directory "corrente" (dipende da come si lancia la JVM).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Stranezze dei file jar

    Originariamente inviato da andbin
    Come è specificato/referenziato nel programma questo db? Con un path relativo? Allora la specifica ... è "relativa" alla directory corrente.
    Se lanci da prompt è evidente quale sia la directory "corrente" (è quella in cui sei). Facendo doppio click sul jar in teoria la directory "corrente" dovrebbe essere "la directory del jar".
    allora:

    il db viene referenziato tramite
    codice:
    dbLocation = new String(System.getProperty("user.dir")
    				+ System.getProperty("file.separator") + "db"
    				+ System.getProperty("file.separator"));
    quindi, se non sbaglio, va a "cercare" il database nella cartella 'db', che sta nella stessa cartella dove si trova il .jar.

    infatti, nella cartella 'Applicazione' c'è il jar, la cartella 'utils', la cartella 'logs' e la cartella 'db'. Dentro a quest'ultima ci sono i file del database.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: Re: Re: Stranezze dei file jar

    Originariamente inviato da faabiioo
    allora:

    il db viene referenziato tramite
    codice:
    dbLocation = new String(System.getProperty("user.dir")
    				+ System.getProperty("file.separator") + "db"
    				+ System.getProperty("file.separator"));
    quindi, se non sbaglio, va a "cercare" il database nella cartella 'db', che sta nella stessa cartella dove si trova il .jar.
    No: va a cercare la cartella "db" che sta dentro alla directory "home" dell'utente (che non è necessariamente quella dove c'è il JAR).


    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    Re: Re: Re: Re: Stranezze dei file jar

    Originariamente inviato da LeleFT
    No: va a cercare la cartella "db" che sta dentro alla directory "home" dell'utente (che non è necessariamente quella dove c'è il JAR).


    Ciao.
    Un dubbio: user.dir è la cartella da cui si lancia il jar, mentre user.home è la cartella predefinita per l'utente che sta usando il PC in quel momento, giusto?
    al volante son nervoso

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: Re: Re: Re: Re: Stranezze dei file jar

    Originariamente inviato da Rubox
    Un dubbio: user.dir è la cartella da cui si lancia il jar, mentre user.home è la cartella predefinita per l'utente che sta usando il PC in quel momento, giusto?
    Sì, scusa ho letto in fretta. "user.dir" è la directory corrente, non la directory home.

    Quel codice cerca una directory "db" all'interno della directory corrente... che può, comunque, non essere la directory in cui è presente il JAR.

    codice:
    $ pwd
    /var/log/
    
    $ java -jar /home/pippo/applicazione/app.jar
    La directory corrente, nell'esempio sopra, non è la directory del jar.


    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

  7. #7

    Re: Re: Re: Re: Re: Re: Stranezze dei file jar

    codice:
    $ pwd
    /var/log/
    
    $ java -jar /home/pippo/applicazione/app.jar
    La directory corrente, nell'esempio sopra, non è la directory del jar.
    nella mia directory ci sono
    codice:
    db  LEGGIMI.txt  logs  utils  applicazione.jar
    quindi, tutti nella stessa cartella.
    Pensavo ad un problema del Manifest, ma non sono sicuro.
    questo è il manifest

    codice:
    Manifest-Version: 1.0
    Rsrc-Class-Path: ./ commons-lang-2.4.jar mysql-connector-java-5.0.8-bi   n.jar swingx-1.6.jar jsoup-0.2.2.jar hsqldb.jar 
    Class-Path: .
    Rsrc-Main-Class: web.focused.crawler.Crawler 
    Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
    Sinceramente, non so dove mettere le mani
    Anche se, il Class-Path mi sembra strano, e non afferro il significato della Main-Class: org.eclipse.jdt....

    non sò, per ora continuo a lanciare la mia applicazione da shell.

    Ah, un'altra cosa (che a me di sicuro non chiarisce): provando la mia applicazione su PC con Windows (Vista, credo), parte col doppio-click, senza nessun problema! :master:

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Come già detto anche da andbin, la directory corrente in ambiente grafico dipende sempre e solo dal sistema operativo.

    Su Windows è possibile che il sistema imposti automaticamente la directory di lavoro uguale alla directory in cui risiede il file che viene aperto. Ma questo non è necessariamente valido anche per Linux/Unix o altri sistemi.

    Ad esempio, se sotto Windows crei un collegamento al tuo JAR, nella finestra delle proprietà del collegamento (tasto destro sul collegamento, proprietà) puoi specificare quale debba essere la directory corrente (casella "Da:").

    Puoi creare il JAR di questa applicazione, ad esempio, e verificare quale sia la directory corrente quando lo esegui con un doppio clic:

    codice:
    import javax.swing.*;
    
    public class DirectoryCorrente {
       public static void main(String[] args) {
          JOptionPane.showMessageDialog(null, "Directory corrente: " + System.getProperty("user.dir"), "Prova directory", JOptionPane.INFORMATION_MESSAGE);
       }
    }
    Il class-path non c'entra nulla in questo caso: se ci fossero problemi di class-path avresti altre eccezioni (NoClassDefFoundError).

    L'attributo Main-Class del MANIFEST indica quale deve essere la classe da avviare (quella con il main): va indicato il nome completo (fully qualified name) della classe (quindi completo di tutta l'indicazione del package).


    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

  9. #9
    Originariamente inviato da LeleFT
    Puoi creare il JAR di questa applicazione, ad esempio, e verificare quale sia la directory corrente quando lo esegui con un doppio clic:

    codice:
    import javax.swing.*;
    
    public class DirectoryCorrente {
       public static void main(String[] args) {
          JOptionPane.showMessageDialog(null, "Directory corrente: " + System.getProperty("user.dir"), "Prova directory", JOptionPane.INFORMATION_MESSAGE);
       }
    }
    Avevi ragione LeleFT, ho provato il jar come hai detto tu, l'ho messo nel desktop (/home/faabiioo/Desktop/) e l'ho lanciato con il classico doppio-click. Risultato: /home/faabiioo/. ossia, crede di trovarsi nella mia cartella di default!

    senza stare troppo a scervellarmi su possibili motivi, ho risolto con uno script sh eseguibile, che lancia il jar.

    forse, ci sono modi più eleganti di risolvere il problema......

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.