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)应用程序的胖子罐,然后通过
这是我的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' } |
当我运行
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视为应用程序类型)。首先,我看到以下内容:
为什么会这样?我可以更改任何Launch4J配置/设置以免发生这种情况吗?
预先感谢!
您需要按照此处所述对launch4j创建的可执行文件进行签名,以防止SmartScreen阻止其运行。另请参阅支持论坛中的相关讨论。
您的第一个问题更像Windows问题。从zip文件解压缩应用程序时,Windows自然会将其标记为不安全,实际上,如果您选中"应用程序属性"选项卡,则会看到一个复选框,您可以在其中删除该不安全属性。与在Linux中为可执行脚本运行
对于第二部分,我假设您正在使用gradle插件来启动Launch4j,假设您的项目文件夹与jre库位于包含可执行文件文件夹的同一文件夹中,通常有两种主要的配置Launch4j的方法。
仅通过指定路径,例如
1 | ../jre |
通过指定完整的相对路径
1 | ../jre/bin/javaw.exe |
在第一种情况下,最后生成的xml应该看起来像这样。
1 2 3 | <jre> <path>../jre</path> </jre> |
主要要点是JRE的路径是相对于可执行文件而不是当前目录的位置。在这种情况下,我们将一个目录从可执行文件夹退回到包含jre的文件夹。
尝试将
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
请注意,路径中不得包含
使用这样的调试标志运行exe时
1 | hello-windows.exe --l4j-debug |
然后将在同一目录中创建文件
在那里,您可以检查是否拾取了正确的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和趋势科技发送请求。随着时间的推移,所有人都高兴地接受了它,只有趋势科技从未对此做出回应。