Запуск JAR файла без прямого вызова `java`

Я развертываю инструмент командной строки, который написан на Java, который принимает аргументы командной строки. Я упакован как файл JAR, потому что удобно иметь один файл.

Проблема в том, что для ее запуска вы должны сначала вызвать java -jar (filename) (args), и это очень раздражает.

В текущем случае у меня есть простой bash script, который запускает его, но это меньше, чем идеально.

Есть ли вообще (в Linux, Ubuntu Server) сделать JAR файл, который сам вызывает виртуальную машину Java? Я искал shebang, но не смог найти его (что, конечно, имеет смысл, так как это скомпилированный код).

Это то, что я хочу сделать: myprogram.jar arg1 -arg2 вместо этого: java -jar myprogram.jar arg1 -arg2

Спасибо,
Brian

Ответ 1

См. Документация /java.txt в документации ядра Linux, в которой описано, как настроить систему с помощью модуля ядра binfmt_misc, чтобы запустите файлы Jar автоматически. Однако это параметр конфигурации, который вы меняете на компьютере, а не что-то, что вы меняете в файле jar, поэтому оно не следует за файлом jar из системы в систему.

Ответ 2

Формат файла .zip(на котором основан формат .jar), кажется, является надежным при наличии дополнительных данных, добавленных к файлу. Таким образом, если вы используете команду cat, чтобы поместить shebang перед zip-данными в файле jar и сделать файл исполняемым, вы можете вызвать файл jar, как вы бы назвали любую обычную оболочку script.

Например: (Обратите внимание, что команда unzip -l предназначена только для иллюстрации этой точки. Она ничего не меняет о .jar и может быть опущена, когда вы на самом деле выполняете этот процесс.)

[[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]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

Ответ 3

В дистрибутиве на основе debian можно установить jarwrapper

sudo apt-get install jarwrapper

Я думаю, что это можно сделать в других дистрибутивах, установив с тем же именем пакета.