我的Java程序如何将文件存储在其.jar文件中?
我知道.jar文件基本上是存档以及应用程序。我要问的是,如何存储打包在程序中的数据(实际文件而不仅仅是字符串)?我想在我的Java代码中执行此操作。
如果你想知道的原因是我正在制作一个游戏的服务器模组。服务器启动并创建所有级别数据,我想将所有这些文件存储在我的.jar应用程序中。
我知道.jar文件基本上是存档以及应用程序。我要问的是,如何存储打包在程序中的数据(实际文件而不仅仅是字符串)?我想在我的Java代码中执行此操作。
如果你想知道的原因是我正在制作一个游戏的服务器模组。服务器启动并创建所有级别数据,我想将所有这些文件存储在我的.jar应用程序中。
是的,你可以这样做。
可以使用 访问类路径上 JAR 文件中的非代码资源。应用程序通常执行此操作,例如,将国际化消息作为资源包嵌入。Class.getResourceAsStream(String)
要将文件放入 JAR 文件中(在项目构建时!),只需在运行命令之前将其复制到输入目录树中的适当位置即可。构建工具,如Maven,Gradle等,可以为您自动化。jar
有没有办法在应用程序内将文件添加到存档中?
从理论上讲,在某些情况下,您的应用程序可以将文件存储在自己的JAR文件中:
该过程将是:
如果初始JAR被JVM / OS锁定,则最后一步可能不起作用。在这种情况下,您需要在包装器脚本中进行重命名。
但是,我认为大多数人都会同意这是一个坏主意。只写常规文件更简单,更强大。
其他答案提供了一些很好的策略,但我建议朝着一个不同的方向前进。
这个游戏据说有图形,是一个桌面应用程序。从 Web 服务器分发桌面应用程序是最容易的。
如果这两件事都适用于您的游戏,那么请考虑使用Java Web Start来部署它。
JWS提供了其他应用程序无法使用的API,而这个问题特别感兴趣的一个是PersistenceService。PersistenceService 允许应用存储和还原少量数据(即使它位于沙盒中)。我做了一个小小的演示,展示了 PersistenceService。
我们的想法是检查持久性服务中的应用程序数据,如果未找到,请使用 Jar 中的数据。如果用户/应用程序更改了数据,请将更改后的数据写入持久性服务。
JWS还提供了其他不错的功能,如初始屏幕,桌面集成,自动更新。