gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:12:51 24 4
gpt4 key购买 nike

我有一个Java应用程序,Izpack安装程序用launch4j64bit包装,然后 bundle 为自解压ZIP,使用How do I make a self extract and running installer?的答案中所述的方法,用 WinRAR 5.20创建

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

Unable to access jarfile C:\Users\Ray\AppData\Local\Temp\RarSFX0\install.jar



我无法重现此错误。

是什么导致此问题?它与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 :

  • In TempMode SFX needs to detect the termination of setup program to delete temporary files. Such approach works correctly if setup program is not terminated before installation is done. But sometimes the setup program starts a child process and terminates, expecting a child process to complete installation. In such case SFX deletes temporary files immediately after detecting that main setup application is finished, resulting in malfunctioning child process. So TempMode works correctly only with those setup programs, which do not start another processes or, at least, are not terminated until all child processes are finished.



    在本段中明确说明,使用 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com