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

标签 java jar archive

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

如果您想知道我正在制作游戏的服务器模组,那么这样做的原因。服务器启动并创建所有关卡数据,我想将所有这些文件存储在我的 .jar 应用程序中。

最佳答案

是的,您可以做到这一点。

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

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


Is there a way to add files to the archive within the app?

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

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

程序是:

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

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

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

关于java - 我的 Java 程序如何在其 .jar 文件中存储文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056682/

相关文章:

无缘无故发生Java错误 "This method must return a result of type string"

java - jstatd 连接问题

Android 上的 Java 并发

java - 如何在 Android/Eclipse 中为 pro 和 lite 创建 2 个具有相同名称的 jar

xcode - 无法归档产品

java 我如何将负整数读作正整数

java - 错误: Could not find or load main class on Mac OSX

java - 在 hadoop 的提示符下创建和运行可运行的 jar

continuous-integration - 使用存档时忽略 xcodebuild 参数

c++ - 将文件夹变成单个文件而不压缩它?