在为Swing桌面应用程序制作jar时为何处放置资源?

时间:2012-09-09 13:53:34

标签: java swing embedded-resource executable-jar

我想知道在哪里可以保留我的资源,比如我正在显示一些图像,在制作可执行jar时播放一些媒体文件?我应该将它包含在可执行jar中还是应该保留在可执行jar之外?

如果我将资源保留在jar之外,我应该在程序中传递哪些URL位置URL来访问图像?

实际上问题是我想制作我的jar文件的可分发副本。

如果我提供本地系统的位置来访问图像和媒体文件,它将在我的系统中工作但是当我在其他系统中分发它时会怎样?

3 个答案:

答案 0 :(得分:4)

这取决于您的申请。

您可以将资源打包到jar中。通常,它适用于从未更改过的资源:公司徽标,图标等。您可以使用getClass().getResourceAsStream()阅读它们。

其他解决方案是从服务器下载文件(例如通过HTTP)。此解决方案适用于您不希望与应用程序打包在一起的介质。例如,您要播放给用户的视频片段。或者,可能是前一个示例中的本地化图标或多语言应用程序的本地化消息。

您正在下载的资源可以缓存。您可以使用用户的临时目录(System.getProperty("java.io.tmpdir")),有时也可以使用preferences API

答案 1 :(得分:3)

这不是一个激进的答案,但实际上,您可以为图像,属性等创建资源项目(甚至是媒体)。

然后,您可以将您的资源项目(以下称为“MyProjectWsResources”)作为子项添加到您的代码项目中(以下称为“MyProjectWsClient”)。由于MyProjectWsResources位于MyProjectWsClient的构建路径中,因此可以更轻松地引用您的资源。如果您不清楚在项目的构建路径中放置什么内容,那么在MyProjectWsResources的src文件夹中的任何内容都是在MyProjectWsClient中进行引用以获取信息时(只要您不使用绝对路径:))

为什么选择多个项目的方法? IMO,它将代码与资源分开,因此您可以单独下载资源和代码,当您的代码只有更新时,您的客户端无需重复下载资源项目(我觉得与资源更新相比,代码更新的频率更高)。较小的服务器带宽(如果您使用的是Java WS或任何其他包装/系统,我现在意识到您可能不是很重要)..仍然,希望这会有所帮助:)

答案 2 :(得分:2)

  

我想制作我的jar文件的可分发副本。

拳头我会在你的问题中解决问题的唯一句子。

通过点击网络上的链接向多个用户分发Swing桌面应用程序的一种很好的方法是Java Web Start

使用JWS进行部署意味着资源需要在Jar中。为了获得JWS“自动更新”特性的最佳结果,媒体的Jar将是:

  • 引用了一个单独的沙盒扩展,因此它们可以与其他应用程序共享,并且可以单独和懒惰地加载/更新(根据需要)。
  • 压缩:
    • 未压缩,用于视频,声音和图像
    • 压缩文本信息(HTML,RTF,CSV ..)
  • 放入应用程序已知的Jar中的路径。 (例如/resources/video/vidNNN.mp4

Jars中的资源是,必须通过URL(或者像Alex提到的InputStream)访问,但URL更健壮。引用info. page

URL urlToResource = this.getClass().getResource("/path/to/the.resource");

在开发过程中,通常最好安排一个构建,以最终用户获取资源的方式组装资源 - 构建应用程序。每次运行。

在其他情况下,您可能希望将资源保留在服务器上的公共位置并根据需要访问它们,但这有效地使服务器成为运行应用程序的媒体相关部分所必需的。您的资源似乎都是静态的(用户不会更改它们)和“应用程序资源”。