Java 无法运行自解压安装程序-无法访问jar文件C:\Users\Ray\AppData\Local\Temp\RarSFX0\install.jar

Java 无法运行自解压安装程序-无法访问jar文件C:\Users\Ray\AppData\Local\Temp\RarSFX0\install.jar,java,windows,launch4j,winrar,izpack,Java,Windows,Launch4j,Winrar,Izpack,我有一个Java应用程序,Izpack安装程序用launch4j64bit包装,然后捆绑成一个自解压ZIP,使用WinRAR5.20创建,方法如 它对我和大多数客户都有效,但最近一些客户报告了如下错误: 无法访问jar文件C:\Users\Ray\AppData\Local\Temp\RarSFX0\install.jar 我无法重现这个错误 是什么导致了这个问题?它是否与Windows更新相关 自解压版本只有一个问题,一个用户必须自己解压的常规.zip文件工作正常 当我运行自解压存档时,它会正

我有一个Java应用程序,
Izpack
安装程序用
launch4j64bit
包装,然后捆绑成一个自解压ZIP,使用WinRAR5.20创建,方法如

它对我和大多数客户都有效,但最近一些客户报告了如下错误:

无法访问jar文件C:\Users\Ray\AppData\Local\Temp\RarSFX0\install.jar

我无法重现这个错误

是什么导致了这个问题?它是否与Windows更新相关

自解压版本只有一个问题,一个用户必须自己解压的常规.zip文件工作正常

当我运行自解压存档时,它会正确地自解压。我们有这样的文件夹结构:

  • 一个文件夹
    JVM64
  • 一个文件
    install.jar
  • 文件
    setup.exe
  • 文件
    setup.ico
但对于有问题的用户,它只提取
JVM64

驱动器C中的卷没有标签。 卷序列号为A663-4CEF C:\Users\gcdr\AppData\Local\Temp目录 14/08/2018 21:40 . 14/08/2018 21:40 .. 2018年8月14日21:40 RarSFX0 0个文件0个字节 C:\Users\gcdr\AppData\Local\Temp\RarSFX0目录 14/08/2018 21:40 . 14/08/2018 21:40 .. 2018年8月14日21:40 JVM64 0个文件0个字节 我发现有一个用户禁用Norton AntiVirus允许安装。
现在我习惯于将每个新版本提交给诺顿白名单,但那个选项已经不存在了


为什么会这样?名为install.jar的文件会有一些限制吗?

我花了一段时间才发现在运行SFX归档时到底发生了什么
songkong-windows64.exe

首先,我检测到临时目录
%TEMP%\RarSFX0
仍然存在,尽管在安装完成后,SFX模块应该在SFX归档的开始将其删除,而不是真正安装应用程序。这是SFX模块根据存档注释文件中的SFX脚本命令执行的
setup.exe
出现问题的第一个迹象,内容如下:

;下面的注释包含SFX脚本命令
Setup=Setup.exe
临时模式
Title=打开松空安装程序包
因此,我在包含
setup.exe
的目录中创建了一个批处理文件,其中包含以下两行:

@setup.exe
@回显退出代码为:%ERRORLEVEL%
在执行批处理文件时,我可以在禁用用户帐户控制的命令提示窗口(完全授予管理权限,无提示)中看到选择安装语言的对话框窗口,同时在命令提示窗口中看到以下行:

退出代码为:0
这表明
setup.exe
已终止,尽管安装尚未完成。因此,它看起来像是一个小型的启动程序应用程序,它并不真正进行安装,而是在安装完成甚至真正开始之前自行终止。那不好

我使用了next free Sysinternal,在运行
songkong-windows64.exe
时查看了该工具记录的文件系统访问,并确认了我的假设:
setup.exe
只是在SFX模块创建的文件夹中运行
JVM64\bin\javaw.exe
,参数为
-jar
install.jar
RarSFX0
RarSFX1

这是非常糟糕的,因为在使用
TempMode
进行SFX归档时,WinRAR。之后可以阅读

  • 在第一个菜单项的“帮助主题”上,在最后一个菜单的“帮助”中单击“运行WinRAR”
  • 单击左侧[+]符号上第一个选项卡上的下一步,列出项目自解压模块
  • 双击子列表项GUI SFX模块:设置命令和
  • 点击链接TempMode
在TempMode中,SFX需要检测安装程序的终止以删除临时文件。如果安装程序在安装完成之前未终止,则这种方法可以正常工作。但有时安装程序启动子进程并终止,期望子进程完成安装。在这种情况下,SFX在检测到主安装应用程序已完成后立即删除临时文件,从而导致子进程出现故障。因此,TempMode仅适用于那些不会启动其他进程或至少在所有子进程完成之前不会终止的设置程序

本段明确说明,使用TempMode执行的应用程序不应在整个安装过程完成之前自行终止。但是,
setup.exe
并不能满足这一非常重要的要求,它在启动真正的安装过程后立即终止

SFX模块尝试删除临时目录
RarSFX0
,但Windows阻止删除,因为
JVM64\bin\javaw.exe
仍在运行,并且
install.jar
当前由Java可执行文件打开。好,根据CPU和硬盘性能的不同,目录
RarSFX0
中包括
install.jar
在内的所有文件都可能在
javaw.exe
启动真正完成之前被删除,并且该可执行文件打开了文件
install.jar
,而子目录
JVM64
肯定永远无法删除由于
javaw.exe而被删除