3

我使用 eclipse 中的 export to jar 选项将我的 java 项目变成了一个可执行的 jar。jar 按预期运行,只是它不使用任何序列化文件。我可以从 GUI 清楚地看到这一点。这个问题可能是什么原因,我该如何解决?

我看到了这个相关的问题 -为什么我的 JAR 文件没有创建序列化?

但它并没有确切地告诉我如何解决这个问题。看起来您无法将文件夹打包到 jar 中。为什么 ?因为代码可能会意外/故意继续将数据添加到该文件夹​​中并使整个 jar 占用硬盘?

如何创建某种结构来打包我的可执行 jar 及其序列化文件夹?

4

4 回答 4

2

回答这个问题:

如何创建某种结构来打包我的可执行 jar 及其序列化文件夹?

一种常见的方法是有一个明确定义的位置来存储序列化文件、设置等,而不依赖于程序从哪里执行。通常它是用户的主目录,或者在 windows 的情况下是应用程序数据。我使用此代码来存储我的应用程序设置:

    String home = System.getenv("APPDATA");
    if (StringUtils.isEmpty(home)) {
        home = System.getProperty("user.home");
    }
    CONFIG_HOME = new File(home, ".myProgram").getAbsoluteFile();
    CONFIG_HOME.mkdirs();

所以在windows上它将使用AppData,而在*nix系统上它将使用用户的家。myProgram 前面的点是让它隐藏在 *nix 平台上,这是一种常见的做法。

编辑对于您在评论中的问题:

在我的 linux 机器上没有 APPDATA 环境变量,所以这段代码将创建一个目录/home/myUser/.myProgram。在 Windows 上,它将类似于c:/Users/myUser/AppData/Local/.myProgram. 在 MacOSX 上,不知道。

于 2013-04-11T03:05:50.027 回答
0

您需要您的 JAR 使用与 eclipse 中的代码相同的路径来读取序列化文件。

因此,您制作了一个包含带有序列化对象的目录的属性文件。然后,这对于您的 JAR 和我们的项目都是一样的。

另见:http ://www.mkyong.com/java/java-properties-file-examples/

于 2013-04-08T13:20:06.280 回答
0

您可以使用

AClass.class.getResource(String str);
//or
AClass.class.getResourceAsStream(String str);

AClass:你的一门课。

str:要读取的文件位置。

例如;

如果您的类层次结构如下所示:

+src
    +-com
         +-test
             |-AClass.java
             +-util
                 +-PrintUtil.java
             +-resources
                 |-Bouble.png
                 |-Mouse.png
                 +-Ocean.png

对于阅读“Mouse.png”图像,您可以通过多种方式进行操作:

AClass.class.getResource("/resources/Mouse.png");
//or
PrintUtil.class.getResource("../resources/Mouse.png");
...
于 2013-04-08T14:36:49.423 回答
0

使用/运行 jar 文件时,不能在 jar 文件中写入内容。当您将 jar 文件放在类路径中或直接从 jar 运行程序时,该 jar 将被您的 jvm 锁定,因此它不允许您更新当前使用的同一 jar 文件。


如果您的类位于文件夹中,而不是存档(您正在使用)中,那么人们给出的解决方案将资源用作流将起作用。


作为存档,您无法直接更新它,您需要执行以下步骤(由您自己或通过 3rd 方 api),
在临时位置提取
更新文件
重新存档

现在由于 jar 文件被锁定,您将无法做第三次手术,这甚至不安全。例如,当您运行 jar 文件时,尝试重命名它,它不会发生,如果发生,jar 文件尚未被 jvm 锁定,只要您调用 jar 内的类,它就会被锁定文件。
为了更好和安全的序列化和文件保存,请查看:java.util.prefs.Preferences.

于 2013-04-10T07:04:42.563 回答