使用jar作为资源存档的简单方法

时间:2012-06-15 03:52:31

标签: java resources jar classloader embedded-resource

所以,我正在研究Java应用程序,我想将资源打包到jar文件中,以使它们更具可移植性。这些jar文件将与应用程序分开,并且只包含资源(图像,声音,保存文件等)。

从这样的jar文件中访问任意资源的最简单方法是什么?我看了一下,但一直找不到任何简单的教程。我知道我可以使用ClassLoader从Jar文件中检索输入流但是如何获得引用正确Jar的ClassLoader?

另外,我如何以编程方式将一堆资源捆绑到这样的jar文件中?如果我可以按照我想要的方式工作,我想将它用于一堆东西,并且希望能够动态创建任何所需的档案。

3 个答案:

答案 0 :(得分:2)

要读取资源,请构建一个新的URLClassLoader,其中包含您要加载的JAR的URL:

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

要创建JAR文件,您可以使用JarOutputStream类。

答案 1 :(得分:0)

getResourceAsStream与资源包路径一起使用应该不是问题,前提是包含资源的jar位于应用程序的类路径中

从二进制文件中自动创建resource.jar的一种方法是使用apache ant进行构建,使用如下所示的目标,您将获取每个res包资源并将其复制到目标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>  

例如,由于以下包

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

resource.jar文件将包含以下包:

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

您也可以更改res

assets

答案 2 :(得分:0)

我的jar文件在classpath中 Thread.currentThread()。getContextClassLoader()。getResourceAsStream(path / file.ext)将按名称加载资源。

jar -cvf jarname.jar resource

将所有资源添加到jarname.jar,尝试使用ZipOutputStream以编程方式实现相同的目标。