from - java execute command linux
Ejecutando un archivo JAR sin llamar directamente a `java` (3)
Estoy implementando una herramienta de línea de comandos que está escrita en Java que acepta argumentos de línea de comandos. Lo tengo empaquetado como un archivo JAR porque es conveniente tener un solo archivo.
El problema es que para ejecutarlo, primero debes llamar a java -jar (filename) (args)
y eso es bastante molesto.
La forma actual en que lo tengo es tener un simple script de bash que lo inicie, pero esto no es lo ideal.
¿Hay alguna forma (en Linux, Ubuntu Server) para crear un archivo JAR que invoque la máquina virtual Java por sí misma? He buscado un shebang, pero no pude encontrar uno (lo cual, por supuesto, tiene sentido ya que es un código compilado).
Esto es lo que quiero hacer: myprogram.jar arg1 -arg2
lugar de esto: java -jar myprogram.jar arg1 -arg2
Gracias,
Brian
Consulte Documentación / java.txt en la documentación del Kernel de Linux , que le indica cómo configurar un sistema utilizando el módulo del kernel binfmt_misc
para ejecutar los archivos Jar automáticamente. Sin embargo, esta es una opción de configuración que cambia en una computadora, no algo que cambia sobre el archivo jar, por lo que no sigue el archivo jar de sistema a sistema.
El formato de archivo .zip (en el que se basa el formato .jar) parece ser sólido en presencia de datos adicionales ante el archivo. Por lo tanto, si usa el comando cat
para colocar un shebang antes de los datos zip en el archivo jar y hacer que el archivo sea ejecutable, puede llamar al archivo jar como llamaría a cualquier script de shell normal.
Por ejemplo: (Tenga en cuenta que el comando unzip -l
es solo para ilustrar el punto. No cambia nada sobre el .jar y se puede omitir cuando esté haciendo este proceso).
[bloom@cat-in-the-hat ~]$ 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
[bloom@cat-in-the-hat ~]$ cat header.txt
#!/usr/bin/java -jar
[bloom@cat-in-the-hat ~]$ cat header.txt tex4ht.jar > tex4ht_exe.jar
[bloom@cat-in-the-hat ~]$ 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
[bloom@cat-in-the-hat ~]$ chmod +x tex4ht_exe.jar
[bloom@cat-in-the-hat ~]$ ./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
En la distribución basada en Debian, es posible instalar jarwrapper
sudo apt-get install jarwrapper
Creo que esto es posible hacer lo mismo en otras distribuciones instalando con el mismo nombre de paquete.