0

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

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

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

4

3 回答 3

2

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.

于 2012-06-15T04:15:07.863 回答
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

您也可以更改resassets

于 2012-06-15T04:09:31.687 回答
0

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

jar -cvf jarname.jar 资源

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

于 2012-06-15T04:13:56.807 回答