我有一个Java应用程序,Izpack
安装程序用launch4j64bit
包装,然后 bundle 为自解压ZIP,使用How do I make a self extract and running installer?的答案中所述的方法,用 WinRAR 5.20创建
它对我和大多数客户都有效,但是最近有一些客户报告了这样的错误:
我无法重现此错误。
是什么导致此问题?它与Windows更新有关吗?
自解压版本只有一个问题,用户必须解压缩自己的常规.zip文件才能正常工作。
当我运行自解压存档时,它会正确进行自解压。因此,我们具有以下文件夹结构:
JVM64
,install.jar
,setup.exe
和setup.ico
。 但是对于有问题的用户,它仅提取
JVM64
: Volume in drive C has no label.
Volume Serial Number is A663-4CEF
Directory of C:\Users\gcdr\AppData\Local\Temp
14/08/2018 21:40 <DIR> .
14/08/2018 21:40 <DIR> ..
14/08/2018 21:40 <DIR> RarSFX0
0 File(s) 0 bytes
Directory of C:\Users\gcdr\AppData\Local\Temp\RarSFX0
14/08/2018 21:40 <DIR> .
14/08/2018 21:40 <DIR> ..
14/08/2018 21:40 <DIR> JVM64
0 File(s) 0 bytes
我发现一位用户禁用Norton AntiVirus允许安装。
现在,我将每个新版本提交给Norton白名单,但该选项已消失。
为什么会这样呢?名为install.jar的文件可能会有一些限制吗?
最佳答案
我花了一段时间才了解运行SFX存档songkong-windows64.exe
的实际情况。
首先,我检测到临时目录%TEMP%\RarSFX0
仍然存在,尽管安装完成后无论是否安装该应用程序,都应在SFX归档文件的开头由SFX模块将其删除。这是第一个迹象,表明SFX模块根据存档注释文件中包含内容的SFX脚本命令执行的setup.exe
出了问题:
;The comment below contains SFX script commands
Setup=setup.exe
TempMode
Title=Unpacking SongKong Installer
因此,我使用以下两行在包含
setup.exe
的目录中创建了一个批处理文件:@setup.exe
@echo Exit code is: %ERRORLEVEL%
我可以从禁用用户帐户控制的命令提示符窗口(没有提示的完全授予管理权限)的对话框窗口中看到批处理文件的执行情况,然后在对话框窗口中选择要安装的语言,同时在命令提示符窗口中找到以下行:
Exit code is: 0
这表明
setup.exe
已终止,尽管根本没有完成安装。因此,看来setup.exe
只是一个小型启动器应用程序,它实际上并未执行安装,并会在安装完成或什至真正开始之前自行终止。这是不好的。我使用了下一个免费的Sysinternals Process Monitor,并在运行
songkong-windows64.exe
时查看了此工具记录的文件系统访问,并确认了我的假设:setup.exe
只是在SFX模块创建的文件夹JVM64\bin\javaw.exe
,-jar
,..中运行带有install.jar
和RarSFX0
参数的RarSFX1
。 。正如 WinRAR 的帮助所写的那样,将
TempMode
用于SFX存档非常糟糕。以后可以看在本段中明确说明,使用 TempMode 执行的应用程序不应在整个安装过程完成之前自行终止。但是
setup.exe
不能满足这个非常重要的要求,它在开始实际安装过程后立即终止。SFX模块尝试删除临时目录
RarSFX0
,但是Windows阻止了此操作,因为JVM64\bin\javaw.exe
仍在运行,并且Java可执行文件当前已打开install.jar
。好吧,根据CPU和硬盘性能的不同,可能会发生以下情况:在RarSFX0
的启动真正完成之前,已经删除了install.jar
目录中的所有文件,包括javaw.exe
,并且该可执行文件打开了文件install.jar
,而子目录JVM64
绝对不能删除,因为javaw.exe
是始终在此刻运行,或被防病毒应用程序扫描以查找有害代码。该解决方案根本不使用启动器应用程序
setup.exe
,而是直接由SFX模块使用所需的参数运行javaw.exe
。让我们假设目录
C:\Temp
包含:批处理文件
CreateSFX.bat
包含以下命令行:@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFolder=%~dp0"
set "SourceFolder=%SourceFolder:~0,-1%"
set "CommentFile=%SourceFolder%\Setup.txt"
for %%I in ("%SourceFolder%") do set "ArchiveFile=%%~dpIsongkong-windows64.exe"
if not exist "%CommentFile%" (
echo ;The comment below contains SFX script commands
echo/
echo Setup=JVM64\bin\javaw.exe -jar install.jar
echo TempMode
echo Title=Unpacking SongKong Installer
)>"%CommentFile%"
del "%ArchiveFile%" 2>nul
rem Create solid RAR5 SFX archive using best compression with 64 MB dictionary size.
echo Create RAR SFX, please wait ...
"%ProgramFiles%\WinRAR\WinRar.exe" a -@ -afrar -cfg- -ep1 -ibck -iicon"%SourceFolder%\setup.ico" -k -m5 -ma5 -md64m -r -s -sfx"%ProgramFiles%\WinRAR\SfxModule\Default64.sfx" -x"%SourceFolder%\Setup.*" -x"%~f0" -tl -y -z"%CommentFile%" -- "%ArchiveFile%" "%SourceFolder%\"
rem Create ZIP SFX archive using best compression.
rem echo Create ZIP SFX, please wait ...
rem "%ProgramFiles%\WinRAR\WinRar.exe" a -@ -afzip -cfg- -ep1 -ibck -iicon"%SourceFolder%\setup.ico" -m5 -r -sfx"%ProgramFiles%\WinRAR\Zip64.sfx" -x"%SourceFolder%\Setup.*" -x"%~f0" -tl -y -z"%CommentFile%" -- "%ArchiveFile%" "%SourceFolder%\"
endlocal
如果该文件尚不存在,则该批处理文件将在执行时创建带有以下内容的文件
C:\Temp\SongKong64\Setup.txt
:;The comment below contains SFX script commands
Setup=JVM64\bin\javaw.exe -jar install.jar
TempMode
Title=Unpacking SongKong Installer
重要的是不同的设置 SFX脚本命令。指示SFX模块使用参数
JVM64\bin\javaw.exe
和setup.exe
运行-jar
而不是install.jar
。在使用相对路径运行javaw.exe
之前,SFX模块将临时目录作为当前目录。然后,批处理文件运行
WinRAR.exe
,以创建SFX存档C:\Temp\songkong-windows64.exe
,其中不包括Setup.*
中的所有C:\Temp\SongKong64
文件以及批处理文件CreateSFX.bat
。使用英文WinRAR 5.60 创建的RAR5 SFX归档文件以及使用的选项,文件大小为111 MiB。
批处理文件还包含用于创建ZIP SFX存档的命令行,该存档的文件大小为133MiB。
运行由该批处理文件创建的SFX归档文件时,将打开用于选择安装语言的对话框窗口,并且在显示此窗口时不会删除任何文件。单击 X 按钮取消安装后,SFX模块将检测到
javaw.exe
终止,并按预期删除临时目录RarSFX0
。我从未完成安装,但是它应该按照此处的说明工作。我无法通过进程监视器看到
setup.exe
定义了特殊的环境变量或修改了javaw.exe
的当前目录。如果
javaw.exe
应该以本地管理员的提升权限运行,则可以添加 WinRAR 开关-iadm
来创建SFX存档,当在Windows Vista及更高版本中启动时,该SFX存档请求管理访问权限。要获得有关使用过的开关的帮助,请通过从目录中的选项卡打开 WinRAR 。详细说明。
为了了解批处理文件中使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
call /?
解释%~dp0
...驱动器和批处理文件的路径,它们以反斜杠结尾,该斜杠在下一个命令行中删除。 del /?
endlocal /?
for /?
if /?
rem /?
set /?
setlocal /?
关于java - 无法运行自解压安装程序-无法访问jarfile C :\Users\Ray\AppData\Local\Temp\RarSFX0\install. jar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51791532/