About
JAR stands for Java ARchive and is file format born in 1996 as a simple extension of the popular ZIP archive format with class and other required resource files:
- signature files
- images, sounds
- …
The primary motivation for its development was so that Java applets and their requisite components (files, images and sounds) can be downloaded to a browser in a single HTTP transaction, rather than opening a new connection for each piece.
With the advent of the Main-Class manifest header, entire applications can be delivered.
Hell
Jar hell is a term similar to describe all the various ways in which the class loading process can end up not working.
To avoid a Jar hell, the shading technique can be used.
Management
Name
Jar Archive name follows the coordinate schema.
Create
You can create JAR files, either:
- by using the JAR utility directly,
- through an IDE such as Oracle JDeveloper, Eclipse, …
- or by using a build tool such as the ant utility, maven or gradle.
With the jar command-line utility.
jar cf myPackage.jar *.class
where:
- 'c': create new archive.
- 'f': create a file.
Create an Executable Jar
Creating a executable jar file needs more steps:
- create a manifest-file containing the start class,
- creating the target directory
- and archiving the files
echo Main-Class: com.gerardnico.HelloWorld>myManifest
md build\jar
jar cfm build\jar\HelloWorld.jar myManifest -C build\classes
Execute
- an executable JAR
java -jar myJAR.jar
- an class with a main class
java -jar myJAR.jar com.example.main arg1 arg2
Verify / Sign
Verification
jar tf build/libs/building-java-libraries.jar
META-INF/
META-INF/MANIFEST.MF
Library.class
You should see the required manifest file —MANIFEST.MF— and the compiled class.
Search class
Windows
for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G
where:
- for /R %G in (*.jar) do
loop over all JAR files in the directory tree, store the file name in %G. See Dos - For Statement
- @jar -tvf %G |
- run the Java Archive command to list all file names within the given archive, and write the results to standard output; the @ symbol suppresses the echoing of the command to standard output.
- find “ClassName” > NUL
- search standard input, piped from the output of the jar command, for the given class name. It will set ERRORLEVEL to 1 if there's a match (otherwise 0). See DOS - Find Command.
- && echo %G
- if ERRORLEVEL is non-zero, write the Java archive file name to standard output (the console). See the AND control opertaor (&&)
Linux
- below a certain location
find path/to/jars -name "*.jar" -exec grep -Hsli ClassName {} \;
- anywhere
for i in $(locate "*.jar");
do echo $i; jar -tvf $i | grep -Hsi ClassName;
done