Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running a JAR file without directly calling `java`

Tags:

I am deploying a command-line tool that is written in Java that accepts command-line arguments. I have it packaged as a JAR file because it is convenient to have a single file.

The problem is that to run it you must first call java -jar (filename) (args) and that is quite annoying.

The current way I have it is to have a simple bash script that launches it, but this is less than ideal.

Is there anyway (in Linux, Ubuntu Server) to make a JAR file that invokes the Java VM by itself? I've looked for a shebang, but couldn't find one (which of course makes sense since it is compiled code).

This is what I want to do: myprogram.jar arg1 -arg2 instead of this: java -jar myprogram.jar arg1 -arg2

Thanks,
Brian

like image 530
HalfBrian Avatar asked Nov 03 '09 14:11

HalfBrian


People also ask

Can I run a jar file without java?

3 Answers. Show activity on this post. Other than 1) asking them to install Java, or 2) writing your own JVM, the answer is generally no. You have to have a JVM/JRE for your jar file, unless you have a development environment that can create a native executable from your code.

How do I run a java program from a jar file?

Running Jar file require you to have the jar file included in your class path. This can be done at run time using URLClassLoader . Simply construct a URLClassLoader with the jar as one of the URL. Then call its forClass(...) if you know the class name (full name of course).

How can I run a jar file in command prompt but with arguments?

Run a Nonexecutable JAR with Arguments To run an application in a nonexecutable JAR file, we have to use -cp option instead of -jar. We'll use the -cp option (short for classpath) to specify the JAR file that contains the class file we want to execute: java -cp jar-file-name main-class-name [args …]


1 Answers

The .zip file format (upon which the .jar format is based) seems to be robust in the presence of extra data prepended to the file. Thus if you use the cat command to put a shebang before the zip data in the jar file, and make the file executable, then you can call the jar file like you would call any ordinary shell script.

For example: (Note that the unzip -l command is just to illustrate the point. It doesn't change anything about the .jar and can be omitted when you're actually doing this process.)

[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 
like image 125
Ken Bloom Avatar answered Sep 17 '22 14:09

Ken Bloom