我的Java程序如何将文件存储在其.jar文件中?

2022-09-04 07:17:10

我知道.jar文件基本上是存档以及应用程序。我要问的是,如何存储打包在程序中的数据(实际文件而不仅仅是字符串)?我想在我的Java代码中执行此操作。

如果你想知道的原因是我正在制作一个游戏的服务器模组。服务器启动并创建所有级别数据,我想将所有这些文件存储在我的.jar应用程序中。


答案 1

是的,你可以这样做。

可以使用 访问类路径上 JAR 文件中的非代码资源。应用程序通常执行此操作,例如,将国际化消息作为资源包嵌入。Class.getResourceAsStream(String)

要将文件放入 JAR 文件中(在项目构建时!),只需在运行命令之前将其复制到输入目录树中的适当位置即可。构建工具,如Maven,Gradle等,可以为您自动化。jar


有没有办法在应用程序内将文件添加到存档中?

从理论上讲,在某些情况下,您的应用程序可以将文件存储在自己的JAR文件中:

  • JAR 必须是本地文件系统中的文件;即不是从远程服务器获取的JAR。
  • 应用程序必须对 JAR 文件及其父目录具有写访问权限。
  • 应用程序必须不需要读回它写到当前类装入器中的JAR的文件;即不退出和重新启动。
  • JAR 必须不需要签名。

该过程将是:

  1. 找到 JAR 文件并作为 ZIP 存档读取器打开。
  2. 创建 ZIP 存档编写器以编写新版本的 JAR 文件。
  3. 将应用程序的文件写入编写器。
  4. 将所有资源从 ZIP 读取器写入写入器,但不包括旧版本的应用程序文件。
  5. 关闭读取器和写入器。
  6. 重命名新版本的 JAR 以替换旧版本。

如果初始JAR被JVM / OS锁定,则最后一步可能不起作用。在这种情况下,您需要在包装器脚本中进行重命名。

但是,我认为大多数人都会同意这是一个坏主意。只写常规文件更简单,更强大。


答案 2

其他答案提供了一些很好的策略,但我建议朝着一个不同的方向前进。

这个游戏据说有图形,是一个桌面应用程序。从 Web 服务器分发桌面应用程序是最容易的。

如果这两件事都适用于您的游戏,那么请考虑使用Java Web Start来部署它。

JWS提供了其他应用程序无法使用的API,而这个问题特别感兴趣的一个是PersistenceService。PersistenceService 允许应用存储和还原少量数据(即使它位于沙盒中)。我做了一个小小的演示,展示了 PersistenceService

我们的想法是检查持久性服务中的应用程序数据,如果未找到,请使用 Jar 中的数据。如果用户/应用程序更改了数据,请将更改后的数据写入持久性服务。


JWS还提供了其他不错的功能,如初始屏幕,桌面集成,自动更新。


推荐