2009-11-03 13 views
20

Sto distribuendo uno strumento da riga di comando scritto in Java che accetta gli argomenti della riga di comando. Lo ho impacchettato come un file JAR perché è conveniente avere un singolo file.Esecuzione di un file JAR senza chiamare direttamente `java`

Il problema è che per eseguirlo è necessario prima chiamare java -jar (filename) (args) e questo è abbastanza fastidioso.

Il modo attuale che ho è di avere un semplice script bash che lo avvia, ma questo non è l'ideale.

Esiste comunque (in Linux, Ubuntu Server) per creare un file JAR che richiama Java VM da solo? Ho cercato uno shebang, ma non sono riuscito a trovarne uno (che ovviamente ha senso visto che è un codice compilato).

Questo è quello che voglio fare: myprogram.jar arg1 -arg2 invece di questo: java -jar myprogram.jar arg1 -arg2

Grazie,
Brian

+0

Nessuna delle risposte indica una soluzione migliore. Ho letto da qualche parte dove concatenate fondamentalmente un comando shell nella parte superiore del file jar. Non elegante ma molto conveniente. https://mesosphere.com/blog/executable-jars/ –

risposta

16

Vedi Documentation/java.txt in the Linux Kernel documentation, che spiega come configurare un sistema che utilizza il modulo binfmt_misc kernel per eseguire Jar file automaticamente. Tuttavia, questa è un'opzione di configurazione che si cambia su un computer, non qualcosa che si modifica sul file jar, quindi non segue il file jar da un sistema all'altro.

+1

Un collegamento correlato: http://www.linuxhq.com/java.html –

+0

Sembra una buona idea, ma non posso permettermi di installare l'SDK su tutte le macchine di produzione. Non ho alcun problema a fare piccole modifiche alla casella di destinazione però. Sono molto piacevolmente sorpreso dal fatto che Linux lo abbia implementato, però, molto impressionante. – HalfBrian

+1

Non è necessario il JDK completo (con il compilatore) per farlo funzionare. Il JRE (di cui avete bisogno sulle macchine di produzione) dovrebbe andare bene. –

39

Il formato di file .zip (su cui è basato il formato .jar) sembra essere robusto in presenza di dati aggiuntivi aggiunti al file. Pertanto, se si utilizza il comando cat per inserire uno shebang prima dei dati zip nel file jar e rendere il file eseguibile, è possibile chiamare il file jar come si farebbe con qualsiasi normale script di shell.

Ad esempio: (Si noti che il comando unzip -l è solo per illustrare il punto Non cambia nulla circa il .jar e può essere omesso quando si sta effettivamente facendo questo processo..)

[[email protected] ~]$ java -jar tex4ht.jar 
    xtpipes (2009-01-27-22:19) 
    Command line options: 
    java xtpipes [-trace] [-help] [-m] [-E] [-s script_file] [-S script_map] 
        [-i script_dir] [-o out_file] 
        [-x...ml2xml_arg...] (-d in_data | in_file) 
    -m  messages printing mode 
    -E  error messages into exception calls 
    in_data XML data directly into the command line 

[[email protected] ~]$ cat header.txt 
#!/usr/bin/java -jar 
[[email protected] ~]$ cat header.txt tex4ht.jar > tex4ht_exe.jar 
[[email protected] ~]$ unzip -l tex4ht_exe.jar 
Archive: tex4ht_exe.jar 
warning [tex4ht_exe.jar]: 21 extra bytes at beginning or within zipfile 
    (attempting to process anyway) 
    Length  Date Time Name 
--------- ---------- ----- ---- 
     0 2009-07-09 15:48 META-INF/ 
     42 2009-07-09 15:47 META-INF/MANIFEST.MF 
     0 2009-07-09 15:48 ./ 
     0 2009-07-09 15:48 tex4ht/ 
    2217 2009-07-09 15:48 tex4ht/DbUtilities.class 
    2086 2009-07-09 15:48 tex4ht/GroupMn.class 
    6064 2009-07-09 15:48 tex4ht/HtJsml.class 
    4176 2009-07-09 15:48 tex4ht/HtSpk.class 
    1551 2009-07-09 15:48 tex4ht/JsmlFilter.class 
    2001 2009-07-09 15:48 tex4ht/JsmlMathBreak.class 
    6172 2009-07-09 15:48 tex4ht/OoFilter.class 
    3449 2009-07-09 15:48 tex4ht/OoUtilities.class 
    1468 2009-07-09 15:48 tex4ht/OomFilter.class 
     346 2009-07-09 15:48 xtpipes.class 
     0 2009-07-09 15:48 xtpipes/ 
    4071 2009-07-09 15:48 xtpipes/FileInfo.class 
    6904 2009-07-09 15:48 xtpipes/InputObject.class 
    25906 2009-07-09 15:48 xtpipes/Xtpipes.class 
    1238 2009-07-09 15:48 xtpipes/Xtpipes$5.class 
     713 2009-07-09 15:48 xtpipes/Xtpipes$3.class 
    1533 2009-07-09 15:48 xtpipes/Xtpipes$1.class 
     709 2009-07-09 15:48 xtpipes/Xtpipes$7.class 
    1294 2009-07-09 15:48 xtpipes/XtpipesEntityResolver.class 
    1235 2009-07-09 15:48 xtpipes/Xtpipes$6.class 
    3367 2009-07-09 15:48 xtpipes/Xtpipes$4.class 
     709 2009-07-09 15:48 xtpipes/Xtpipes$8.class 
    1136 2009-07-09 15:48 xtpipes/Xtpipes$2.class 
     875 2009-07-09 15:48 xtpipes/XtpipesPrintWriter.class 
    1562 2009-07-09 15:48 xtpipes/XtpipesUni.class 
     0 2009-07-09 15:48 xtpipes/util/ 
    5720 2009-07-09 15:48 xtpipes/util/ScriptsManager.class 
    1377 2009-07-09 15:48 xtpipes/util/ScriptsManagerLH.class 
---------      ------- 
    87921      32 files 
[[email protected] ~]$ chmod +x tex4ht_exe.jar 
[[email protected] ~]$ ./tex4ht_exe.jar 
    xtpipes (2009-01-27-22:19) 
    Command line options: 
    java xtpipes [-trace] [-help] [-m] [-E] [-s script_file] [-S script_map] 
        [-i script_dir] [-o out_file] 
        [-x...ml2xml_arg...] (-d in_data | in_file) 
    -m  messages printing mode 
    -E  error messages into exception calls 
    in_data XML data directly into the command line 
+1

Wow! Funziona davvero! Sono seriamente impressionato! –

+2

Questa è una soluzione molto interessante, anche se abbastanza non ortodossa. –

+0

@Daniel: concordato. la soluzione 'binfmt_misc' è sicuramente la più pulita, ma questa è una vera e propria hack ;-) –

2

sulla distribuzione basata su Debian, è possibile installare jarwrapper

sudo apt-get install jarwrapper 

penso che questo sia possibile fare la stessa cosa su altre distribuzioni installando con lo stesso nome del pacchetto.

Problemi correlati