Running an executable JAR from command-line
An “executable JAR” is nothing but a JAR in which the entry point of execution is defined. That definition can be given in its manifest file (META-INF/Manifest.mf
).
The general structure of a JAR file:
+-MyJar.jar
|-+-META-INF
|-|----Manifest.mf
|-+-com
|-|-+-package
|-|-|----MyJavaFile.java
|-|-|----MySecondJavaFile.java
The manifest file should contain the details of the JAR file. It keeps the attribute as key-value pairs.
The structure of a manifest file:
Main-Class: com.package.MyJavaFile
Specification-Title: "My Classes"
Specification-Version: "
1.0
"
Specification-Vendor:
"
Sun Microsystems, Inc.
"
Implementation-Title: "
subin.util
"
Implementation-Version:
"
build01
"
Implementation-Vendor:
"
Sun Microsystems, Inc.
"
If the executable JAR is dependent on any other JAR, we need to specify it in the Manifest itself (even though there is an option to do it while invoking the application thru java -cp
).
Class-Path: aJar.jar anotherJar.jar
I had some problems in building a JAR file using the conventional jar -cvf
command. Whatever I do, it was not picking my custom manifest (I’m very bad). So, I used ANT to build a JAR.
ANT file to build a JAR:
<project name="Demo" default="build.jar.file"> <target name="build.jar.file"> <jar destfile="myJar.jar" basedir="."> <manifest> <attribute name="Main-Class" value="com.package.MyJavaFile" /> <attribute name="Class-Path" value="aJar.jar anotherJar.jar" /> </manifest> </jar> <copyfile dest="/path/to/deploy" src="myJar.jar"/> </target> </project>
- use ANT or Eclipse IDE to build the JAR
Running the JAR from the command-line:
$ java -jar myJar.jar [optional parameters]
External Links:
http://en.wikipedia.org/wiki/Manifest_file
http://en.wikipedia.org/wiki/JAR_file
http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html
http://java.sun.com/docs/books/tutorial/deployment/jar/ – Packaging tutorial from Sun
http://ant.apache.org/manual/
http://en.wikipedia.org/wiki/Apache_Ant
Subinkrishna G 5:27 pm on January 29, 2009 Permalink
In the ANT build file I’ve mentioned only two attributes – Class-Path & Main-Class. These two are the most important attributes in this scenario. So using the “attribute” tag in “manifest” we can define all the other attributes too.
Mathew Varghese 2:22 pm on February 13, 2009 Permalink
Add-on: If we don’t want to keep dependent JARs external, we can bundle within our target JAR. Use
zipfileset
ANT task.<zipfileset src="firstJar.jar" includes="**/*.java **/*.class"/>
Read more: http://ant.apache.org/manual/CoreTypes/zipfileset.html