Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347

    Eccezioni durante l'esecuzione da eseguibile jar

    Perdonate il titolo vago, ma non so come ben definire il problema... praticamente stavo cercando su internet come arrivare al percorso di un'applicazione in un eseguibile jar, e l'ho trovato.
    Ho provato a eseguirlo per verificarne il funzionamento in una classe apposita e, finchè sono rimasto all'interno di eclipse, il codice funziona, mentre all'esterno no.
    L'eccezione generata è a livello del classloader e il codice è questo:
    codice:
    package test_esempi;
    
    
    import java.io.File;
    import java.io.UnsupportedEncodingException;
    import java.net.*;
    import javax.swing.*;
    
    
    public class Main {
        
        /**
         * @param args
         */
        public static void main(String[] args) {
            URL url = Main.class.getProtectionDomain().getCodeSource().getLocation();
            String jarPath = null;
            try {
                jarPath = URLDecoder.decode(url.getFile(), "UTF-8");
            } catch(UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            
            String parentPath = new File(jarPath).getParentFile().getPath();
            parentPath = parentPath + File.separator;
            
            JOptionPane.showMessageDialog(null, "Percorso corrente: " + parentPath);
            
        }
    }
    Sapreste dirmi se ho sbagliato qualcosa? C'è qualcosa di cui non ho tenuto conto? Perchè mi sembra assurdo che da IDE funzioni e all'esterno invece no!

    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da John360 Visualizza il messaggio
    praticamente stavo cercando su internet come arrivare al percorso di un'applicazione in un eseguibile jar, e l'ho trovato.

    Sapreste dirmi se ho sbagliato qualcosa? C'è qualcosa di cui non ho tenuto conto? Perchè mi sembra assurdo che da IDE funzioni e all'esterno invece no!
    Faccio innanzitutto una breve premessa. Quel getLocation() fornisce un URL nel seguente modo:

    - se la classe è "sfusa" sul file-system (non in jar), il URL fa riferimento alla directory che contiene il package "radice", escludendo quindi i nomi di package "riflessi" nelle directory. Se hai una classe es. com.esempio.Prova in:

    C:\blabla\com\esempio\Prova.class

    allora getLocation() fornisce un URL del tipo "file:/C:/blabla/"

    - se la classe è in un jar sul file-system, allora il URL fa riferimento esattamente al jar, es. "file:/C:/blabla/nomeapp.jar"

    Detto questo, tieni presente che non c'è bisogno di fare alcun URLDecoder.decode o roba del genere. File ha un apposito costruttore: File(URI uri) . Nota: URI, non URL. Ma URL ha un metodo toURI().

    Quindi nel caso di un jar, basta fare:

    codice:
    URL url = Main.class.get.........
    File jarFile = new File(url.toURI());

    e in jarFile hai il corretto riferimento al jar. E getParentFile() chiaramente dà la sua directory.
    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
    Registrato dal
    Oct 2011
    Messaggi
    347
    Grazie per l'info, non sapevo come funzionasse il getLocation() e in effetti non capivo nemmeno a cosa servisse quella decodifica.
    Ho trovato l'errore comunque, perchè creando il jar da riga di comando non tenevo conto dei package, ecco perchè l'eccezione partiva dal classloader.

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.