Java 将jar用作资源归档的简单方法

Java 将jar用作资源归档的简单方法,java,resources,jar,classloader,embedded-resource,Java,Resources,Jar,Classloader,Embedded Resource,所以,我正在开发一个Java应用程序,我想将资源打包到jar文件中,使它们更具可移植性。这些jar文件将与应用程序分开,并且只包含资产(图像、声音、保存文件等) 从这样的jar文件中访问任意资源的最简单方法是什么?我已经四处看了一下,但没有找到任何简单的教程。我知道我可以使用类加载器从Jar文件中检索输入流,但是如何获得引用正确Jar的类加载器呢 另外,我如何以编程方式将一组资源捆绑到这样一个jar文件中?如果我能以我想要的方式工作,我想用它来做很多事情,并且希望能够动态地创建任何需要的归档。在

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

从这样的jar文件中访问任意资源的最简单方法是什么?我已经四处看了一下,但没有找到任何简单的教程。我知道我可以使用类加载器从Jar文件中检索输入流,但是如何获得引用正确Jar的类加载器呢


另外,我如何以编程方式将一组资源捆绑到这样一个jar文件中?如果我能以我想要的方式工作,我想用它来做很多事情,并且希望能够动态地创建任何需要的归档。

在资源包路径中使用
getResourceAsStream
应该不会有问题,前提是带资源的jar位于应用程序的类路径中

从二进制文件自动创建resource.jar的一种方法是用于构建,使用如下目标,您将获取每个
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>  
resource.jar
文件将包含以下包:

 com/myapp/logic/res
 com/myapp/menu/res 
 com/myapp/actions/res
您还可以更改
res
assets

I jar文件位于类路径中 Thread.currentThread().getContextClassLoader().getResourceAsStream(path/file.ext)将按名称加载资源

jar-cvfjarname.jar资源


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

要阅读资源,请使用要从中加载的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文件,可以使用类。

正确的JAR?您将拥有完全相同的打包和名称的资源?出于各种原因,我建议
getResource(“/path/to/the.resource”)
over
getResourceAsStream
。请参阅(在其中,我列出了替代方案,没有解释)。@DaveNewton-不,当然不是,我只是引用了我想要针对特定外部jar的事实。@AndrewThompson-好的,我明白为什么这可能是个好主意。谢谢你的提示。@CodeBunny为什么?如果资源具有唯一的限定符,则不需要指定jar.Sweet,谢谢。我不知道你可以动态创建类加载器。事实上,我认为你选择了一个过于复杂的解决方案。获取资源的最简单方法是将Jar添加到应用程序的运行时类路径。做到这一点的最佳方法取决于它的部署方式在特定情况下,建立一个
URLClassLoader
非常方便,但这不是必需的。无法在沙盒代码中建立
ClassLoader
,而
getResource(String)
方法适用于沙盒或受信任的代码。
File jarFile1 = new File("myjar.jar");
File jarFile2 = new File("myjar2.jar");
ClassLoader myJarLoader = URLClassLoader.newInstance(new URL[] {jarFile1.toURI().toURL(), 
                                                                jarFile2.toURI().toURL()});