Windows 10不信任Gradle Launch4J EXE

Gradle Launch4J EXE not trusted by Windows 10

请注意:我已经在这里创建了这个GitHub项目,可以用来完美重现我所遇到的问题。

此处的Java 8试图通过gradle-launch4j Gradle插件使用Launch4J来构建Windows本机EXE应用程序。我正在Mac上开发Java Swing应用程序,但该应用程序必须在Windows 10上作为Windows EXE运行。

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

这是我的Launch4J的Gradle配置:

1
2
3
4
5
6
7
8
9
10
11
12
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时,它产生:

1
2
3
4
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视为应用程序类型)。首先,我看到以下内容:

enter

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

预先感谢!


您需要按照此处所述对launch4j创建的可执行文件进行签名,以防止SmartScreen阻止其运行。另请参阅支持论坛中的相关讨论。


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

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

  • 仅通过指定路径,例如

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

    1
    ../jre/bin/javaw.exe
  • 在第一种情况下,最后生成的xml应该看起来像这样。

    1
    2
    3
    <jre>
        <path>../jre</path>
    </jre>

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


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

    1
    2
    3
    4
    launch4j {
      ...
      bundledJrePath = 'jre8'
    }

    因为在您的情况下,这是解压缩zip时jre的相对路径。

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

    , ,

    The property is used to specify the absolute or relative path (to the executable) of a bundled JRE, it does not rely on the current directory or . Note that this path is not checked until the actual application execution

    请注意,路径中不得包含/bin/javaw.exe

    使用这样的调试标志运行exe时

    1
    hello-windows.exe --l4j-debug

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

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

    我从sschuberth投票赞成上述答案,因为这是对您问题的最佳答案。对可执行文件进行签名会使SmartScreen满意。

    此外,我宁愿阻止尝试创建可执行文件,甚至对其进行签名,最好不要创建MSI。例如,通过使用Javapackager。另请参阅此问题。那家伙在使用Nullsoft之后创建了自己的工具。

    要让可执行文件被全世界每一个病毒扫描程序接受都是非常麻烦的。我有使用WIX Toolset创建MSI并将其package到Bootstrapper可执行文件中的经验,并使用公司签名证书对其进行了签名。但是最后,我不得不向McAfee,Norton,Avast,AVG,KasperSky和趋势科技发送请求。随着时间的推移,所有人都高兴地接受了它,只有趋势科技从未对此做出回应。