有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

但它并没有告诉我如何避开这个问题。看起来你不能把文件夹装进罐子里。为什么?因为代码可能会意外地/有意地继续将数据添加到该文件夹中,并使整个jar占用硬盘

如何创建某种结构,在其中打包可执行jar及其序列化文件夹


共 (4) 个答案

  1. # 1 楼答案

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


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


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

    现在,由于jar文件被锁定,您将无法执行第三个操作,这甚至不安全。例如,当您运行一个jar文件时,尝试重命名它,它不会发生,如果发生了,jar文件还没有被jvm锁定,那么每当您调用jar文件中的类时,它就会被锁定。
    为了更好、更安全的序列化和文件保存,请查看以下内容:^{}

  2. # 2 楼答案

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

    因此,您可以创建一个属性文件,其中包含带有序列化对象的目录。 那么,你的JAR和我们的项目都是一样的

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

  3. # 3 楼答案

    你可以用

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

    课堂:你的一门课

    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");
    ...
    
  4. # 4 楼答案

    回答这个问题:

    How do I create some kind of structure in which I pack my executable jar and its serialization folder ?

    一种常见的方法是有一个定义良好的位置来存储序列化文件、设置等,而不依赖于程序从何处执行。通常是用户的主目录,如果是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上,不知道