CodeBunny
CodeBunny

Reputation: 2031

Simple way to use a jar as a resource archive

So, I'm working on a Java application and I'd like to package resources into jar files to make them more portable. These jar files would be separate from the application and would only contain assets (images, sounds, save files, etc).

What's the simplest way to access arbitrary resources from inside a jar file like this? I've looked around a bit, but haven't been able to find any simple tutorials. I know that I can retrieve input streams from a Jar file with a ClassLoader but how do I get a ClassLoader that references the correct Jar?

Also, how can I programmatically bundle a bunch of resources into such a jar file? If I can get this working the way I want, I'd like to use it for a bunch of stuff, and would like to be able to dynamically create any needed archives.

Upvotes: 0

Views: 310

Answers (3)

prunge
prunge

Reputation: 23268

For reading resources, construct a new URLClassLoader with the URLs of the JARs you want to load from:

File jarFile1 = new File("myjar.jar");
File jarFile2 = new File("myjar2.jar");
ClassLoader myJarLoader = URLClassLoader.newInstance(new URL[] {jarFile1.toURI().toURL(), 
                                                                jarFile2.toURI().toURL()});

For creating JAR files, you can use the JarOutputStream class.

Upvotes: 2

dinox0r
dinox0r

Reputation: 16059

Shouldn't be a problem to use getResourceAsStream with the resource package path, provided that the jar with the resources is in the classpath of your application

A way to automatically create the resource.jar from your binaries is using apache ant for building, using a target like the following, you will take every res package resources and copy it into the destination jar

<property name="binDir" value="bin" />
...

<target name="resources-jar">
    <echo message="Generating resources.jar" />
    <jar compress="true" destfile="resources.jar" filesetmanifest="mergewithoutmain">
        <fileset defaultexcludes="true" dir="${binDir}"> 
            <include name="**/res/**" />              
        </fileset>
    </jar>
</target>  

For example, due the following packages

 com/myapp/logic 
 com/myapp/logic/res
 com/myapp/menu
 com/myapp/menu/res 
 com/myapp/actions
 com/myapp/actions/res

The resource.jar file will contain the following packages:

 com/myapp/logic/res
 com/myapp/menu/res 
 com/myapp/actions/res

Also you can change res for assets

Upvotes: 0

Subin Sebastian
Subin Sebastian

Reputation: 10997

I jar file is in classpath Thread.currentThread().getContextClassLoader().getResourceAsStream(path/file.ext) will load the resource by name.

jar -cvf jarname.jar resource

will add all the resources to jarname.jar, try using ZipOutputStream to programatically achieve the same.

Upvotes: 0

Related Questions