我有一个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.jarRarSFX0参数的RarSFX1。 。

    正如 WinRAR 的帮助所写的那样,将TempMode用于SFX存档非常糟糕。以后可以看
  • 单击进入最后一个菜单中的运行 WinRAR 第一个菜单项上的帮助帮助主题
  • 在第一个选项卡上单击下一步目录列表左侧的[+]符号上的到列表项自解压模块
  • 双击子列表项 GUI SFX模块:设置命令
  • 单击链接 TempMode :



  • 在本段中明确说明,使用 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包含:
  • SongKong64
  • JVM64 ...及其所有子目录和文件
  • CreateSFX.bat
  • install.jar
  • setup.exe
  • setup.ico

  • 批处理文件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.exesetup.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/

    10-13 08:29