请注意::我创建了this GitHub project right here,可用于完美重现我看到的问题。
此处的Java 8 尝试通过Launch4J Gradle插件使用gradle-launch4j来构建Windows本机EXE应用程序。我正在Mac上开发Java Swing应用程序,但该应用程序必须在Windows 10上作为Windows EXE运行。我还使用ShadowJar构建了独立的“胖罐”。
我可以构建(Swing)应用程序的胖子,然后通过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配置/设置,以免发生这种情况?
谢谢!
答案 0 :(得分:1)
尝试将bundledJrePath
中的build.gradle
设置为jre8
:
launch4j {
...
bundledJrePath = 'jre8'
}
因为在您的情况下,这是提取zip时jre的相对路径。
<path>
,<minVersion>
,<maxVersion>
<path>
属性用于指定捆绑JRE的绝对路径或相对路径(至可执行文件),它不依赖于当前目录或<chdir>
。请注意,只有在实际应用执行之前,才会检查此路径
请注意,路径中不得包含/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)
...
答案 1 :(得分:1)
您的第一个问题更像是Windows问题。从zip文件解压缩应用程序时,Windows自然会将其标记为不安全,实际上,如果您选中应用程序属性选项卡,则会看到一个复选框,您可以在其中删除该不安全属性。与在Linux中为可执行脚本运行chmod+x
相同。
在第二部分中,我假设您使用的是Launch4j的gradle插件,假设您的项目文件夹与jre库在包含可执行文件文件夹的同一文件夹中共同构建,则有两种主要的配置Launch4j的方法。
仅通过指定路径来
../jre
通过指定完整的相对路径
../jre/bin/javaw.exe
最后一种情况下,您生成的xml应该看起来像这样。
<jre>
<path>../jre</path>
</jre>
要点是,JRE的路径是相对于可执行文件而不是当前目录的位置。在这种情况下,我们将一个目录从可执行文件夹退回到包含jre的文件夹。
答案 2 :(得分:1)
您需要按照here所述对launch4j创建的可执行文件进行签名,以防止SmartScreen阻止其运行。另请参见support forum中的相关讨论。
答案 3 :(得分:0)
我从sschuberth投票赞成上述答案,因为这是对您问题的最佳答案。对可执行文件进行签名会使SmartScreen满意。
此外,我宁愿阻止尝试创建可执行文件,甚至对其进行签名,最好不要创建MSI。例如,使用Javapackager。另请参见this question。那个人在使用Nullsoft之后创建了own tool。
要让一个可执行文件被全世界每一个病毒扫描程序接受都是非常麻烦的。我有使用WIX Toolset创建MSI并将其包装到引导程序可执行文件中的经验,并使用公司签名证书对其进行了签名。但是最后,我不得不向McAfee,Norton,Avast,AVG,KasperSky和趋势科技发送请求。随着时间的推移,所有人都高兴地接受了它,只有趋势科技从未对此做出回应。