Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    158

    Pathname Assoluti e Relativi

    Salve a tutti , nn so se il titolo è corretto o meno , vi chiedo di scusarmi in anticipo nn sapevo proprio cosa scrivere. Ho realizzato un'applicazione Java perfettamente funzionante sulla mia macchina , tale applicazione carica anche alcune immagini dinamicamente ed apre alcuni file .pdf ( questi file chiaramente si trovano nel pacchetto dei sorgenti ). Ho la necessità di eseguire tale applicazione su altre macchine.... ho problemi proprio con questi file , come faccio per risolvere ?

    posto un pò di codice per essere più chiaro :

    codice:
    theProcess = Runtime.getRuntime().exec("evince file:///home/user/NetBeansProjects/Prova/src/Guide/Guida.pdf");
    codice:
    jLabel5.setIcon(new javax.swing.ImageIcon(home+"/Scrivania/WebMon/src/immagini/deb.jpeg"));
    la home l'ho ottenuta così :
    codice:
    this.home=System.getProperty("user.home");
    per eseguire l'applicazione su un'altra macchina devo copiare la cartella dist ed eseguire il file .jar ?

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    una prassi che uso in genere: piazzare la roba che ti serve in diverse posizioni:

    1. directory di esecuzione
    2. path specificato da utente
    3. home

    la prima non hai problemi a reperirla, la seconda la passi come property (-Dpathname) la terza la prendi dal sistema.
    Poi se hai bisogno di un punto base (Come una directory root) puoi utilizzare uno dei valori e specificare poi cmq path che sono in generale assoluti perchè partono da / o da C:, ma relativi al tuo path specificato per l'esecuzione (uno tra i 3 che ti ho detto).
    Non so se ti è chiara la soluzione che adotto

  3. #3
    Allora, il primo path è assoluto, quindi per fuzionare il file pdf si deve trovare esattamente sotto l'albero delle directory da te specificato.

    Il secondo invece mi sta bene la ricerca della home dell'utente, ma poi usi nuovamente dei path che mi sembrano rischiosi (quanto sei sicuro che sulla macchina in cui girerà ci sarà la directory Scrivania, per esempio? Sun macchina windows no di sicuro).

    Infine, stai usando "/" per separare i path. Sulle macchine Windows non ti funzionerà.

    Quindi per risolvere io farei così:

    Sol. 1) Usa path relativi. Ricordati che quando scrivi un path se questo è relativo comincia sempre dalla directory in cui si trova il jar che fa partire l'applicazione. Quindi tu puoi distribuire l'applicazione come un file .zip (ad es.) da scompattare a piacimento e il cui contenuto non va toccato, in modo tale da poter caricare i file con path relativi. Ovunque verrà scompattato i path funzioneranno. Ricordati però di aggiustare il separatore di path! Non usare "/" ma File.separator, che restituisce il carattere giusto a seconda del sistema operativo.

    Sol. 2) Guarda come si fa ad usare file inclusi dentro il jar, sempre che tu possa. Nel senso, se per esempio quei pdf non sono generati dal programma ma sono pregenerati e distribuiti con l'applicazione, cerca di includeri nel jar, così sei più sicuro che ci siano, che non vengano toccati e che i percorsi siano sempre corretti..

    Se preferisci la soluzione 1 (che in generale va bene, alla fine è quello che fanno tutti i programmi che installi tu: creano la loro directory e ci mettono dentro le loro risorse. Se cancelli roba, non funzionano più), potresti pensare di guardare izpack (http://izpack.org/). é un'applicazione java molto carina che ti permette di creare degli installer completamente multipiattaforma, con annessi e connessi vantaggi (come creare shortcut, anche nel menù programmi sotto windows, per esempio).


    Ciao!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    158
    nn ho capito , per piacere puoi essere un pò più chiaro Grazie....

    in effetti il problema delle immagini potrei risolverlo , rendendo quest'ultime statiche , in pratica incollandole per l'applicazione associata ( e dividendo il tutto in 2 applicazioni dedicate , simili ma separate ).

    Però mi resta il problema del lancio della guida .pdf , che devo necessariamente lanciarla.
    Come devo fare con il percorso.... io nella cartella src ho inserito una cartella contentente il file Guida.pdf

    Mi confermate che copiare la cartella dist e esuguire il file .jar è corretto ?

    tale applicazione deve girare solo su Linux , in particolare sistemi Debian.
    Per RedHat e Windows creo pacchetti a parte.

    Grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    devi costruirti il path alla resource.
    In genere robe come guide, come immagini vengono messe in una cartella appunto chiamata resource.
    Fai una roba simile

    path home
    |____class (o bin) contiene file .class
    |____resource, contiene tutto ciò che ti serve ma che non è java
    |____src contiene tutti i tuoi sorgenti
    |____lib contiene librerie esterne (se necessarie)

    per cui tu ogni volta vai a beccare path home e te la metti in una variabile.
    Questa la puoi specificare in vari modi, il caso più semplice è appunto la cartella di esecuzione

    (es. /home/user/progetto

    progetto è la tua path home, quindi il primo path che ritrovi è quello che va da / a progetto.

    Dopo di che a questo aggiungi, con File.Separator, il resto delle tue risorse:

    codice:
    File pa = new File (path_home, "resource" + File.Separator + nomefile);
    in questo caso hai sempre un path assoluto in pa.

    Come ti trovi path home? Benissimo puoi decidere che è la tua cartella di progetto o dist da cui esegui, puoi specificarla come path oppure puoi cercare una cartella di nome progetto nella home (avendo cura di mantenere la struttura). La terza soluzione la usano quasi tutti i programmi unix che non sono installati per tutti gli utenti

  6. #6
    Ma non è più semplice fare tutto con i path relativi??

    allora:

    myApp (cartella principale, messa dove vuoi: desktop, home, /usr/ bla bla bla)
    |____myapp.jar (il jar eseguibile dell'applicazione)
    |____resource (cartella con le risorse)


    Ecco, diciamo che ora metti tutto alla rinfusa dentro "resource" (immagini, pdf, ecc)

    Il path da usare è
    codice:
    File pa = new File ("resource" + File.Separator + nomefile);
    Mi sembra più semplice. Dove metti metti la cartella myApp funziona...

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    codice:
    File pa = new File ("resource" + File.Separator + nomefile);
    occhio che come dici tu cerca nella directory corrente del .class che fa la richiesta la cartella resource e il file, non parte dalla directory base (per quello serve il path assoluto alla prima home del progetto)

    il problema dei path è che se tu sei dentro il package

    com.package.non.so.quanto.profondo.farlo

    questo si troverà dentro classes o bin e se la tua classe è dentro questo package, resource andrà cercata sotto la cartella farlo, non da base dir, capito?

    Partendo da base dir (cioè l'absolute path a base dir) e concatenando il path relativo hai sempre un path assoluto quindi nessun problema.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    158
    mmmmm sto provando ma nn riesco a lanciare questa miniguida ufffff

    grazie per i suggerimenti
    a domani
    Notte

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    scusa inizia a farlo cablato (poi via via relativizzi):

    metti nella tua cartella home una cartella che chiami come ti pare (es. project) con all'interno i tuoi pdf

    il tuo path assoluto sarà del tipo

    /home/user/projetc/file.pdf

    inizia a costruirlo partendo quindi da

    user.dir (che trovi da System.getProperty) a cui poi concateni project e file

    1. recupera user.dir (avrai path in una stringa di nome path)
    2. apri file su project

    codice:
    File f = new File (pathToHome, "project");
    e questo non è altro che un puntatore alla cartella project.
    da qui se controlli se la cartella esiste, se non è vuota (controlli non strettamente necessari, ma se usi tanta roba qui questi controlli puoi farli all'avvio)

    Infine

    codice:
    File pdf = new File (f.getAbsolutePath(), nomeFilePdf);
    e hai il path alla tua risorsa.

    E' una cosa che faccio una marea di volte nel mio codice e funziona sempre. Devi sempre avere un punto di partenza. Ora io ho supposto che sia la cartella project nella tua home, ma come vedi il principio è generale e usando qualche parametro puoi anche parametrizzare questo discorso

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da canemacchina
    Infine, stai usando "/" per separare i path. Sulle macchine Windows non ti funzionerà.
    Sbagliato: andrebbe sempre usata la notazione "Unix-like" (dove non sia possibile usare File.separator) proprio per avere la portabilità... si arrangia la JVM a decodificare il percorso usando il backslash su Windows.

    Questo codice funzionerà alla perfezione su Windows:

    codice:
    File f = new File("C:/Windows/pippo.txt");
    FileOutputStream fos = new FileOutputStream( f );
     ...
    fos.close();
    E' il caso di tutti quei percorsi (possibilmente relativi) che devono essere scritti all'interno di un file di properties e letti dall'applicazione.


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