Запуск файла JAR без прямого вызова `java`
Я развертываю инструмент командной строки, написанный на Java, который принимает аргументы командной строки. Я упаковал его как файл JAR, потому что удобно иметь один файл.
Проблема в том, что для его запуска необходимо сначала вызвать java -jar (filename) (args)
и это довольно раздражает.
В настоящее время у меня есть простой bash-скрипт, который его запускает, но это далеко не идеально.
Есть ли способ (в Linux, Ubuntu Server) создать файл JAR, который сам вызывает виртуальную машину Java? Я искал шебанг, но не смог его найти (что, конечно, имеет смысл, поскольку это скомпилированный код).
Вот что я хочу сделать: myprogram.jar arg1 -arg2
вместо этого: java -jar myprogram.jar arg1 -arg2
Спасибо,
Брайан
3 ответа
См. Documentation / java.txt в документации по ядру Linux, где рассказывается, как настроить систему с помощью binfmt_misc
модуль ядра для автоматического запуска файлов Jar. Однако это параметр конфигурации, который вы изменяете на компьютере, а не то, что вы меняете в файле jar, поэтому он не следует файлу jar от системы к системе.
Формат файла.zip (на котором основан формат.jar) кажется надежным при наличии дополнительных данных, добавленных к файлу. Таким образом, если вы используете cat
команда, чтобы поместить shebang перед данными zip в файле jar и сделать файл исполняемым, тогда вы можете вызвать файл jar так же, как любой обычный сценарий оболочки.
Например:
(Обратите внимание, что unzip -l
Команда просто чтобы проиллюстрировать смысл. Это ничего не меняет в.jar и может быть опущено, когда вы на самом деле делаете этот процесс.)
[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
В дистрибутиве на основе Debian можно установить jarwrapper
sudo apt-get install jarwrapper
Я думаю, что это можно сделать то же самое в других дистрибутивах, установив с тем же именем пакета.