我使用jpackage将jar文件打包到windows安装程序中:
"C:Program FilesJavajdk-17.0.5binjpackage"
--name test-installer
--input .
--main-jar test.jar
--runtime-image ../jre1.8.0_341/
--main-class com.xxxxx.Main
--win-console
给我test-installer.exe。安装后,可执行文件无法运行。
控制台输出给出:
Error: Registry key 'SoftwareJavaSoftJava Runtime Environment'CurrentVersion'
has value '1.8', but '' is required.
Error: could not find java.dll
Error: Could not find Java SE Runtime Environment.
如果有帮助,这里是WinDbg输出
************* Path validation summary **************
Response Time (ms) Location
Deferred srv*
Symbol search path is: srv*
Executable search path is:
ModLoad: 00007ff6`7b7d0000 00007ff6`7b841000 jpackageapplauncher.exe
ModLoad: 00007ffa`7d980000 00007ffa`7db89000 ntdll.dll
ModLoad: 00007ffa`7cf90000 00007ffa`7d04d000 C:WINDOWSSystem32KERNEL32.DLL
ModLoad: 00007ffa`7b0e0000 00007ffa`7b45c000 C:WINDOWSSystem32KERNELBASE.dll
ModLoad: 00007ffa`7c950000 00007ffa`7cafd000 C:WINDOWSSystem32USER32.dll
ModLoad: 00007ffa`7ae60000 00007ffa`7ae86000 C:WINDOWSSystem32win32u.dll
ModLoad: 00007ffa`7d4a0000 00007ffa`7d4c9000 C:WINDOWSSystem32GDI32.dll
ModLoad: 00007ffa`7b6f0000 00007ffa`7b809000 C:WINDOWSSystem32gdi32full.dll
ModLoad: 00007ffa`7b5d0000 00007ffa`7b66d000 C:WINDOWSSystem32msvcp_win.dll
ModLoad: 00007ffa`7af00000 00007ffa`7b011000 C:WINDOWSSystem32ucrtbase.dll
ModLoad: 00007ffa`7c040000 00007ffa`7c7f8000 C:WINDOWSSystem32SHELL32.dll
(3eb4.dfbc): Break instruction exception - code 80000003 (first chance)
ntdll!LdrpDoDebuggerBreak+0x30:
00007ffa`7da5cef4 cc int 3
0:000> g
ModLoad: 00007ffa`7d1f0000 00007ffa`7d221000 C:WINDOWSSystem32IMM32.DLL
ModLoad: 00007ffa`7c800000 00007ffa`7c8ea000 C:WINDOWSSystem32shcore.dll
ModLoad: 00007ffa`7b990000 00007ffa`7ba2e000 C:WINDOWSSystem32sechost.dll
ModLoad: 00007ffa`79f50000 00007ffa`79f68000 C:WINDOWSSYSTEM32kernel.appcore.dll
ModLoad: 00007ffa`7d140000 00007ffa`7d1e3000 C:WINDOWSSystem32msvcrt.dll
ntdll!NtTerminateProcess+0x14:
00007ffa`7da24104 c3 ret
我不明白,这里的jpackage是什么?使用install4j的试用版制作的安装程序。
我做错了什么?有什么想法吗?
查看您正在使用的jpackage
命令,看起来您正在尝试使用Java 8 JRE作为运行时映像:
--runtime-image ../jre1.8.0_341/
这不可能。正如您所发现的,它会导致无法启动的运行时映像损坏。Java 8 JRE并不是这样设计的。
一般来说,传递给--runtime-image
的运行时映像应该使用jlink
工具从与jpacakge
相同的JDK制作。