2012-06-15 33 views
0

因此,我正在研究一个Java应用程序,并且我想将资源打包到jar文件中以使它们更具可移植性。这些jar文件将与应用程序分开,并且只包含资源(图像,声音,保存文件等)。使用jar作为资源档案的简单方法

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

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

+0

“正确的罐子”?你将拥有完全相同包装和名称的资源? –

+0

由于各种原因,我建议'getResource(“/ path/to/the.resource”)通过'getResourceAsStream'。请参阅[信息。关于嵌入式资源的页面](http://stackoverflow.com/tags/embedded-resource/info)(我在其中列出了没有解释的备选方案)。 –

+0

@DaveNewton - 不,当然不是,我只是简单地引用了我想要定位特定外部jar的事实。 – CodeBunny

回答

2

对于阅读资源,构造一个新的URLClassLoader你想从载入的JAR文件的网址:

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类。

+0

甜,谢谢。我不知道你可以即时创建ClassLoaders。 – CodeBunny

+1

其实,我认为你已经选择了一个过于复杂的解决方案。 **最简单的获取资源的方法是将Jar添加到应用程序的运行时类路径中。要做到这一点的最佳方式取决于*如何部署。 - OTOH在特定的情况下建立一个'URLClassLoader'非常方便,但这不是必需的。建立一个'ClassLoader'不能在沙盒代码中完成,而'getResource(String)'方法适用于沙盒或可信的代码。 –

0

不应该使用getResourceAsStream与资源包路径的问题,前提是拥有资源的jar是在您的应用程序

一种方法从您的二进制文件自动创建resource.jar的类路径使用apache ant建筑,使用目标像下面,你将采取一切res包资源并将其复制到目标罐子

<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 

您也可以为assets

0

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

的jar -cvf jarname.jar资源

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