Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Passare argomento al .jar

    Problema: ho una mia applicazione compilata in un .jar, vorrei far sì che se l'utente aprisse un file con la mia applicazione (apri con ->pippo.jar) ottenessi il nome del file aperto, magari passandolo come argomento nell'array args..come posso fare?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Passare argomento al .jar

    Originariamente inviato da ranza!!!123
    come posso fare?
    Su che sistema operativo? Su Mac OS X puoi usare un ApplicationListener, per Windows e Linux ci sarà qualcosa di analogo...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    windows..speravo ci fosse un metodo semplice come in visualbasic, che metteva automaticamente il percorso in una variabile di sistema..

  4. #4
    Non riesco a risolvere..anyone?

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

    Re: Passare argomento al .jar

    Originariamente inviato da ranza!!!123
    Problema: ho una mia applicazione compilata in un .jar, vorrei far sì che se l'utente aprisse un file con la mia applicazione (apri con ->pippo.jar) ottenessi il nome del file aperto, magari passandolo come argomento nell'array args..come posso fare?
    Se si avvia direttamente il jar con java -jar blabla.jar allora il "classpath" principale è composto solo dal jar stesso e quindi la system property "java.class.path" contiene solo il path usato proprio nella specifica dopo -jar. Che può essere facilmente "assolutizzato" (perdonate il termine inconsueto) tramite java.io.File:

    codice:
    import java.io.*;
    
    public class Test {
        public static void main(String[] args) throws Exception {
            String cp = System.getProperty("java.class.path");
    
            File dir = new File(cp).getCanonicalFile().getParentFile();
    
            System.out.println(cp);
            System.out.println(dir);
        }
    }
    Se il test.jar si trova fisicamente ad esempio in C:\Programmi\test.jar, con vari possibili lanci "assoluti" o "relativi" si ha:

    1) Si specifica il jar in modo assoluto:

    C:\>java -jar C:\Programmi\test.jar
    C:\Programmi\test.jar
    C:\Programmi

    2) Si specifica il jar in modo relativo (da una C:\temp):

    C:\temp>java -jar ..\Programmi\test.jar
    ..\Programmi\test.jar
    C:\Programmi

    3) Si specifica il jar in modo relativo (dalla directory corrente che è la stessa del jar):

    C:\Programmi>java -jar test.jar
    test.jar
    C:\Programmi

    In ogni caso si ottiene C:\Programmi che è la directory del jar.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Da quello che ho capito io della domanda dell'utente, quello che chiede è ottenere il nome di un file passato come argomento alla sua applicazione... ovvero, args[0]:

    codice:
    ...
    public static void main(String[] args) {
       if (args.length > 0) {
          System.out.println("Richiesta apertura del file: " + args[0]);
       } else {
          System.out.println("Nessun file passato come argomento");
       }
    }
    Non capisco, però, cosa c'entri il sistema operativo usato, ma non conoscendo l'ambiente Mac potrebbe essere che questo metodo non funzioni e sia necessario usare la libreria linkata da Alex'87...


    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
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da LeleFT
    Non capisco, però, cosa c'entri il sistema operativo usato, ma non conoscendo l'ambiente Mac potrebbe essere che questo metodo non funzioni e sia necessario usare la libreria linkata da Alex'87...
    Da quello che ho capito io lui vorrebbe attivare la funzione "click destro su un file -> Apri con... -> MIA_APP".

    Per lavoro ho dovuto fare una cosa analoga in ambiente mac e per mac c'è un metodo apposito che viene invocato dalla jvm quando si fa "click destro -> apri con -> MIA_APP" (oppure se si trascina un file sull'icona dell'applicazione). E sono abbastanza sicuro che una cosa del genere ci sia anche per gli altri sistemi operativi (ovviamente le classi da usare saranno altre, quelle sono estensioni di Apple).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Come ho già detto non conosco l'ambiente Mac.
    Quello che è certo è che su ambienti Win/Linux per avviare un'applicazioen Java è necessario richiamare l'interprete (java) passando il nome del JAR (o la classe) da avviare.

    Facendo delle prove prettamente su Windows, non è possibile né trascinare un file sopra un JAR per chiederne l'apertura, né usare direttamente il JAR selezionandolo tramite l'opzione "Tasto DX sul file X -> Apri con...", pur avendo abilitato l'apertura automatica dei JAR al clic. Questo perchè, di fatto, non è il JAR ad essere eseguito, quanto l'esecutore (java) a cui viene passato il JAR come argomento.

    Quello che mi risulta oscuro è il perchè di quella libreria: aprire un file usando un JAR (chiamando quest'ultimo come si vuole, con un clic, da riga di comando, usanto "l'apri con...") significa avviare il JAR passando ad esso il nome del file come argomento ed è esattamente ciò che accade con qualunque altra applicazione come Acrobat, Notepad, Word, ecc). E gli argomenti arrivano alla classe nel metodo main() fra i parametri args...

    Poi, ripeto, può essere che Mac sia differente da tutti gli altri (hanno regole proprie anche per quanto concerne l'SDK, non metto in dubbio che ce le abbian per qualunque altra cosa), ma in linea di principio è questo ciò che viene fatto.

    Inviterei, comunque, l'autore del post a precisare meglio la sua richiesta.


    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
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da LeleFT
    Quello che mi risulta oscuro è il perchè di quella libreria: aprire un file usando un JAR (chiamando quest'ultimo come si vuole, con un clic, da riga di comando, usanto "l'apri con...") significa avviare il JAR passando ad esso il nome del file come argomento ed è esattamente ciò che accade con qualunque altra applicazione come Acrobat, Notepad, Word, ecc). E gli argomenti arrivano alla classe nel metodo main() fra i parametri args...

    Poi, ripeto, può essere che Mac sia differente da tutti gli altri (hanno regole proprie anche per quanto concerne l'SDK, non metto in dubbio che ce le abbian per qualunque altra cosa), ma in linea di principio è questo ciò che viene fatto.
    La differenza principale è che su mac ogni applicazione (tranne rarissime eccezioni) può essere in esecuzione una volta sola (in pratica sono tutte dei singleton..)! Cerco di spiegarmi: avvio il programma A e lo lascio in esecuzione. Se poi cerco di lanciare di nuovo lo stesso programma A facendo doppio click sull'icona in realtà quello che ottengo è l'istanza precedente del programma, non ne apro un'altra! (non so se mi sono spiegato).

    Nel caso in questione, se il programma è già stato avviato io non lo posso aprire di nuovo e quindi non potrei sfruttare il passaggio di parametri al main (c'è già stato la prima volta, ora basta visto che il main non verrà più richiamato).
    Se io ho il mio programma in esecuzione (se non lo è, viene avviato) e voglio selezionare un file per fare "apri con -> mia app", il nome di quel file lo recupero nel metodo handleOpenFile(ApplicationEvent).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Alex'87
    La differenza principale è che su mac ogni applicazione (tranne rarissime eccezioni) può essere in esecuzione una volta sola (in pratica sono tutte dei singleton..)! Cerco di spiegarmi: avvio il programma A e lo lascio in esecuzione. Se poi cerco di lanciare di nuovo lo stesso programma A facendo doppio click sull'icona in realtà quello che ottengo è l'istanza precedente del programma, non ne apro un'altra! (non so se mi sono spiegato).
    Ecco, questa non la sapevo proprio. Ora mi è più chiaro (ed è sensato) il motivo di quella libreria.

    Per quanto concerne ambienti come Win/Linux, dove ogni volta viene avviata una nuova istanza dell'applicazione, le cose funzionano. Ho appena generato un EXE (usando JSmooth) di questa mia piccola ed inutile applicazione, e funziona alla perfezione:

    codice:
    import javax.swing.*;
    
    public class Esegui {
       public static void main(String[] args) {
          if (args.length > 0) {
             JOptionPane.showMessageDialog(null, "File da aprire: " + args[0]);
          } else {
             JOptionPane.showMessageDialog(null, "Nessun file da aprire!");
          }
       }
    }
    Trascinandoci sopra un file, compare correttamente il messaggio con l'indicazione del file da aprire.


    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.