将文件打包在JAR中,然后将其移动到正确的目录中

时间:2012-03-29 18:59:15

标签: java eclipse jar packaging executable-jar

我到处寻找这个,但我似乎无法弄明白。

我正在用Java创建一个使用Midi库的应用程序。为了运行此应用程序,用户必须在lib / audio的JRE安装文件夹中有一个SoundBank文件(soundbank.gm)。我不想让用户自己解决这个问题,所以我希望我可以将soundbank打包为应用程序中的资源,当应用程序启动时,我可以通过编程方式将其移动到正确的目录中不在那里。

首先,我需要知道如何在JAR中打包资源。然后我需要知道如何将资源复制到不同的目录。我知道如何复制普通文件,但我不知道如何能够访问JAR中的文件。

任何帮助将不胜感激。我正在使用eclipse BTW导出Runnable JAR。

编辑:我刚刚弄清楚我的文件没有被打包在JAR中的原因是因为我没有在eclipse中将它声明为源文件夹。现在我如何在Java中访问该文件?我可以简单地将JAR名称视为文件夹名称吗?

3 个答案:

答案 0 :(得分:2)

为了从Java应用程序访问JAR文件(或类似路径中的任何位置)中打包的资源,您可以使用:

getClass().getResourseasStream("path/to/resource");

如果资源与您的类在同一个包中,您只需要资源名称而不需要任何路径(例如当前目录),如果资源位于不同的包中,您可以使用绝对路径。请参阅Class.getResourseAsStream()的javadoc。获得流后,您可以从中读取,复制它,就像通常使用任何流一样。

答案 1 :(得分:2)

这样做的一种直接方法是将您的java资源作为流访问并将其复制到您想要的位置,例如使用公共IOUtils实用程序类:

InputStream is = MyInstallerClass.class.getResourceAsStream("/path/to/my/resource");
OutputStream os = new FileOutputStream("/path/to/install/directory");
org.apache.commons.io.IOUtils.copy(is,os);

答案 2 :(得分:1)

假设您在您的JAR中的“资源”下面打包soundback.gm。

然后,您可以使用以下内容访问该文件...

ClassLoader cl = this.getClass().getClassLoader();
InputStream is = cl.getResourceAsStream("resources/soundback.gm");

然后您可以通过此...将该InputStream转换为文件...

OutputStream out = new FileOutputStream(new File("/lib/audio/soundback.gm"));

int read = 0;
byte[] bytes = new byte[1024];

while ((read = is.read(bytes)) != -1) {
   out.write(bytes, 0, read);
}

is.close();
out.flush();
out.close();