当项目转换为可执行jar时,序列化文件不起作用?

时间:2013-04-04 10:12:27

标签: java eclipse jar

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

我看到了这个相关的问题 - Why does my JAR file not create a serialization?

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

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

4 个答案:

答案 0 :(得分: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 env变量,所以这段代码将创建一个目录/home/myUser/.myProgram。在Windows上,它将类似于c:/Users/myUser/AppData/Local/.myProgram。在MacOSX上,不知道。

答案 1 :(得分:0)

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

因此,您创建一个包含序列化对象的目录的属性文件。 然后,对于您的JAR和我们的项目,这都是相同的。

另请参阅:http://www.mkyong.com/java/java-properties-file-examples/

答案 2 :(得分: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");
...

答案 3 :(得分:0)

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

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


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

现在当jar文件被锁定时,你将无法进行第三次操作,这甚至都不安全。作为一个例子,当你运行一个jar文件时,尝试重命名它,它不会发生,如果它发生了,jar文件还没有被jvm锁定,它会在你调用jar里面的类时被锁定文件。
为了更好,更安全地进行序列化和文件保存,请查看:java.util.prefs.Preferences