当项目转换为可执行jar时,java序列化文件不工作?
我使用eclipse中的导出到jar选项将java项目制作成一个可执行的jar。jar按预期运行,只是它不使用任何序列化文件。我可以从GUI中清楚地看到这一点。这个问题的原因是什么?我该如何解决它
我看到了这个相关的问题——Why does my JAR file not create a serialization?
但它并没有告诉我如何避开这个问题。看起来你不能把文件夹装进罐子里。为什么?因为代码可能会意外地/有意地继续将数据添加到该文件夹中,并使整个jar占用硬盘
如何创建某种结构,在其中打包可执行jar及其序列化文件夹
# 1 楼答案
在使用/运行jar文件时,不能在jar文件中写入。当您将jar文件放入类路径或直接从jar运行程序时,jar将被jvm锁定,因此它不允许您更新当前使用的同一jar文件
人们给出的解决方案是,如果你的类在文件夹中,而不是在存档(你正在使用的)中,那么使用资源作为流将起作用
作为存档文件,您不能直接更新它,您需要执行以下步骤(由您自己或第三方api),
在临时位置提取
更新文件
重新归档
现在,由于jar文件被锁定,您将无法执行第三个操作,这甚至不安全。例如,当您运行一个jar文件时,尝试重命名它,它不会发生,如果发生了,jar文件还没有被jvm锁定,那么每当您调用jar文件中的类时,它就会被锁定。
为了更好、更安全的序列化和文件保存,请查看以下内容:^{
# 2 楼答案
您需要JAR使用与eclipse中的代码相同的路径来读取序列化文件
因此,您可以创建一个属性文件,其中包含带有序列化对象的目录。 那么,你的JAR和我们的项目都是一样的
另见:http://www.mkyong.com/java/java-properties-file-examples/
# 3 楼答案
你可以用
课堂:你的一门课
str:您要读取的文件位置
例如
如果您的类层次结构如下所示:
对于阅读“Mouse.png”图像,你可以通过多种方式来阅读:
# 4 楼答案
回答这个问题:
一种常见的方法是有一个定义良好的位置来存储序列化文件、设置等,而不依赖于程序从何处执行。通常是用户的主目录,如果是windows,则是应用程序数据。我使用以下代码存储我的应用程序设置:
所以在windows上,它将使用AppData,在*nix系统上,它将使用用户的主页。myProgram前面的圆点是将其隐藏在*nix平台上,这是一种常见的做法
编辑评论中的问题:
在我的linux机器上没有APPDATA env变量,因此这段代码将创建一个目录
/home/myUser/.myProgram
。在windows上,它将类似于c:/Users/myUser/AppData/Local/.myProgram
。在MacOSX上,不知道