【问题标题】:Gradle Launch4J EXE not trusted by Windows 10Windows 10 不信任 Gradle Launch4J EXE
【发布时间】:2020-03-23 04:30:30
【问题描述】:

请注意:我创建了this GitHub project right here,可以用来完美重现我看到的问题。


Java 8 在此尝试通过 gradle-launch4j Gradle 插件使用 Launch4J 来构建 Windows 原生 EXE 应用程序。我正在我的 Mac 上开发 Java Swing 应用程序,但该应用程序必须在 Windows 10 上作为 Windows EXE 运行。我还使用 ShadowJar 来构建我的独立“胖罐”。

我可以构建我的 (Swing) 应用程序的 fat jar,然后通过 java -jar build/lib/myapp.jar 在我的 Mac 上运行它。它启动并运行没有问题。

这是我的 Launch4J 的 Gradle 配置:

launch4j {
    mainClassName = 'com.example.windows.hello.HelloWindowsApp'
    icon = "${projectDir}/icon.ico"
    jdkPreference = 'jdkOnly'
    initialHeapSize = 128
    jreMinVersion = '1.8.0'
    jreMaxVersion = '1.8.9'
    maxHeapSize = 512
    stayAlive = false
    bundledJre64Bit = true
    bundledJrePath = '../hello-windows/jre8'
}

当我运行 ./gradle clean build shadowJar createExe createDistro 时,它会产生:

hello-windows.zip/
    hello-windows.exe       -->     The Windows EXE built by the 'createExe' task
    lib/*                   -->     The lib/ dir for the EXE that is also built by the `createExe` task 
    jre8/                   -->     OpenJDK JRE8 (copied from the libs/jre8 dir)

所以我复制了该 ZIP 文件并将其移植到 Windows 10(64 位)机器上。我提取 ZIP 并通过在 Windows 资源管理器中双击它来运行 EXE(我可以确认 确实 将 EXE 视为 Application 类型)。首先我看到这个:

为什么会发生这种情况?我可以更改任何 Launch4J 配置/设置,以免发生这种情况吗?

提前致谢!

【问题讨论】:

  • 你能从Windows命令行用--l4j-debug参数启动exe文件,然后把生成的launch4j.log的内容贴在这里吗?见github.com/TheBoegl/gradle-launch4j#debugging
  • 我克隆了您的 GitHub 存储库并使用您发布的 Gradle 命令构建了项目。我可以确认 exe 文件可以在我的带有 Windows 10 企业评估版 64 位的虚拟机中启动。防守方没有确认,也没有其他消息。只是 GUI 会正确弹出。

标签: windows gradle java-8 gradle-plugin launch4j


【解决方案1】:

您需要按照here 的描述对由 launch4j 创建的可执行文件进行签名,以防止 SmartScreen 阻止它运行。另见support forum中的相关讨论。

【讨论】:

    【解决方案2】:

    您的第一个问题更像是一个 Windows 问题。当您从 zip 文件中解压缩应用程序时,Windows 会自然地将其标记为不安全,事实上,如果您检查应用程序属性选项卡,您会看到一个复选框,您可以在其中删除该不安全属性。这与在 Linux 中为可执行脚本运行 chmod+x 相同。

    对于第二部分,我假设您正在使用 Launch4j 的 gradle 插件,有两种主要方法可以配置 Launch4j,假设您的项目文件夹的结构通常与包含可执行文件夹的同一文件夹中的 jre 库一起构建。

    1. 通过指定路径只喜欢

      ../jre
      
    2. 通过指定完整的相对路径

      ../jre/bin/javaw.exe
      

    您最后生成的 xml 在第一种情况下应该是这样的。

    <jre>
        <path>../jre</path>
    </jre>
    

    主要的一点是,JRE 的路径是相对于可执行文件的位置而不是当前目录。在这种情况下,我们从可执行文件夹退回一个目录到包含 jre 的文件夹。

    【讨论】:

    • 感谢@Chibueze (+1) - 你的建议奏效了,找到了 JRE!如果您不介意的话,只是给您一个快速的后续问题:当您说“事实上,如果您检查应用程序属性选项卡,您将看到一个复选框,您可以在其中删除该不安全属性”,我很抱歉,但我不是 100% 理解。 您指的是哪个“应用程序属性”选项卡,我在哪里可以找到它?基本上,我只需要这个“Windows Defender”警告消失并运行我的应用程序,我该如何解决?
    • @hotmeatballsoup 我指的是当您右键单击可执行文件并单击属性时显示的窗口。唯一的解决方案是签署文件。您可以使用自己的强键sign it。由于您使用的是Mac,我相信您可以通过Mono
    【解决方案3】:

    尝试将build.gradle 中的bundledJrePath 设置为jre8

    launch4j {
      ...
      bundledJrePath = 'jre8'
    }
    

    因为在您的情况下,这是提取 zip 时 jre 所在的相对路径。

    http://launch4j.sourceforge.net/docs.html

    &lt;path&gt;&lt;minVersion&gt;&lt;maxVersion&gt;

    &lt;path&gt; 属性用于指定捆绑 JRE 的绝对或相对路径(到可执行文件),它不依赖于当前目录或&lt;chdir&gt;。请注意,在实际应用程序执行之前不会检查此路径

    注意路径不能包含/bin/javaw.exe

    当像这样运行带有 debug 标志的 exe 时

    hello-windows.exe --l4j-debug
    

    然后它将在同一目录中创建一个文件launch4j.log。 在那里您可以检查是否选择了正确的 jre,例如:

    ...
    Bundled JRE:    jre8
    Check launcher: C:\Users\IEUser\Downloads\hello-windows\jre8\bin\javaw.exe (OK)
    ...
    

    【讨论】:

      【解决方案4】:

      我赞成 sschuberth 的上述答案,因为这是对您问题的最佳答案。签署可执行文件将使 SmartScreen 满意。

      此外,我宁愿阻止尝试创建可执行文件,甚至对其进行签名,最好创建一个 MSI。例如使用Javapackager。另见this question。那家伙在使用 Nullsoft 之后创建了他的own tool

      让世界各地的每个病毒扫描程序都接受一个可执行文件是非常麻烦的。我有使用WIX Toolset 创建 MSI 并将其包装到引导程序可执行文件中的经验,使用公司签名证书对其进行签名。但是最后我不得不向 McAfee、Norton、Avast、AVG、KasperSky 和 ​​Trend Micro 发送请求。很高兴所有人都接受了它,但只有趋势科技从未回应。

      【讨论】:

        猜你喜欢
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多