java.net.JarURLConnection Example
In this example we shall show you how to make use of JarURLConnection
class, This class establishes a connection to a jar URL using the JAR protocol. A JarURLConnection
instance can refer to either a JAR archive file or to an entry of such a file. jar URLs are specified as follows: jar:{archive-url}!/{entry}
where !/
is called a separator. This separator is important to determine if an archive or an entry of an archive is referred.
Examples:
Jar entry: jar:http://www.jcg.com/bar/baz.jar!/com/foo/Quux.class
Jar file: jar:http://www.jcg.com/bar/baz.jar!/
Jar directory: jar:http://www.jcg.com/bar/baz.jar!/com/foo/
Now, suppose that we have a main application. Also, we have a small application which is doing some logic for our main application. How we can run our small app which was packaged as a JAR file from inside our main app?
So, Let’s see the below example.
Example:
Bean.java:
package com.jcg; /** * @author ashraf * */ public class Bean { public static void main( String [] args) { sayHello(); } public static void sayHello() { System.out.println("Hello from loaded JAR class !!!"); } }
JarURLConnectionTest.java:
package com.jcg; import java.io.IOException; import java.lang.reflect.Method; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Map.Entry; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; /** * @author ashraf * */ public class JarURLConnectionTest { private final static String JAR_URL = "jar:file:/C:/Users/ashraf_sarhan/simple-bean-1.0.jar!/"; private final static String JAR_FILE_PATH = "file:/C:/Users/ashraf_sarhan/simple-bean-1.0.jar"; private static URLClassLoader urlClassLoader; /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { try { // Create a URL that refers to a jar file in the file system URL FileSysUrl = new URL(JAR_URL); // Create a jar URL connection object JarURLConnection jarURLConnection = (JarURLConnection)FileSysUrl.openConnection(); // Get the jar file JarFile jarFile = jarURLConnection.getJarFile(); // Get jar file name System.out.println("Jar Name: " + jarFile.getName()); // When no entry is specified on the URL, the entry name is null System.out.println("\nJar Entry: " + jarURLConnection.getJarEntry()); // Get the manifest of the jar Manifest manifest = jarFile.getManifest(); // Print the manifest attributes System.out.println("\nManifest file attributes: "); for (Entry entry : manifest.getMainAttributes().entrySet()) { System.out.println(entry.getKey() +": "+ entry.getValue()); } System.out.println("\nExternal JAR Execution output: "); // Get the jar URL which contains target class URL[] classLoaderUrls = new URL[]{new URL(JAR_FILE_PATH)}; // Create a classloader and load the entry point class urlClassLoader = new URLClassLoader(classLoaderUrls); // Get the main class name (the entry point class) String mainClassName = manifest.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS); // Load the target class Class beanClass = urlClassLoader.loadClass(mainClassName); // Get the main method from the loaded class and invoke it Method method = beanClass.getMethod("main", String[].class); // init params accordingly String[] params = null; // static method doesn't have an instance method.invoke(null, (Object) params); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Output:
Jar Name: C:\Users\ashraf_sarhan\simple-bean-1.0.jar Jar Entry: null Manifest file attributes: Build-Jdk: 1.7.0_40 Built-By: ashraf_sarhan Manifest-Version: 1.0 Created-By: Apache Maven Main-Class: com.jcg.Bean Archiver-Version: Plexus Archiver External JAR Execution output: Hello from loaded JAR class !!!
Explanation:
In the above example, It’s possible you don’t know the main class of the JAR file which you need to run it so we loaded our simple-bean-1.0.jar file which print a message to console using JarURLConnection
and reading its Manifest
to find the entry point class (i.e., main class name – com.jcg.Bean
), then we create a classloader and load the entry point class. Finally, we are using reflection to get its public static void main(String[])
method and invoke it.
Tip
When constructing a JAR url via new URL(context, spec)
, the following rules apply:
- if there is no context URL and the specification passed to the URL constructor doesn’t contain a separator, the URL is considered to refer to a JarFile.
- if there is a context URL, the context URL is assumed to refer to a JAR file or a Jar directory.
- if the specification begins with a ‘/’, the Jar directory is ignored, and the spec is considered to be at the root of the Jar file.
Examples:
context: jar:http://www.jcg.com/bar/jar.jar!/
, spec: baz/entry.txt
url: jar:http://www.jcg.com/bar/jar.jar!/baz/entry.txt
context: jar:http://www.jcg.com/bar/jar.jar!/baz
, spec: entry.txt
url: jar:http://www.jcg.com/bar/jar.jar!/baz/entry.txt
context: jar:http://www.jcg.com/bar/jar.jar!/baz
, spec: /entry.txt
url: jar:http://www.jcg.com/bar/jar.jar!/entry.txt
Download the Source Code of this example:
This was an example of how to use JarURLConnection
class.
You can download the full source code of this example here: java.net.JarURLConnection Example Code