我是Java编程的新手,但大致了解一切如何运作。我想将一个jar文件和jre放进Windows可执行文件(exe)中,这样当我分发它时,客户端就不需要安装JRE。我应该使用什么程序?
我有launch4j,它似乎正好符合我的要求,但当我尝试运行应用程序时,出现“此应用程序配置为使用捆绑的Java运行时环境,但运行时环境丢失或损坏。”
我希望我的应用程序只是可运行的exe,而不是安装程序。至少,有人能向我展示如何正确地将JRE与launch4j捆绑吗?
我是Java编程的新手,但大致了解一切如何运作。我想将一个jar文件和jre放进Windows可执行文件(exe)中,这样当我分发它时,客户端就不需要安装JRE。我应该使用什么程序?
我有launch4j,它似乎正好符合我的要求,但当我尝试运行应用程序时,出现“此应用程序配置为使用捆绑的Java运行时环境,但运行时环境丢失或损坏。”
我希望我的应用程序只是可运行的exe,而不是安装程序。至少,有人能向我展示如何正确地将JRE与launch4j捆绑吗?
我唯一能够捆绑JRE的方法是使用Launch4J和Inno Setup Compiler。
首先,在输出文件(.exe)的同一目录下创建一个jre6
文件夹(例如)。
然后将JRE从您的系统复制到您的jre6文件夹中。
然后打开Launch4J并设置捆绑的JRE路径 - 只需输入jre6
。然后单击“构建”按钮(显然,您需要在输入所有其他参数之后 - 但您在JRE选项卡本身上需要输入的唯一值是捆绑的JRE路径值)。
我原本以为这样可以正常工作,但如果您将.exe文件移动到新位置(因此它不再与您的jre6文件夹共存),则在尝试运行应用程序时会出现此应用程序已配置为使用捆绑的Java Runtime Environment,但运行时缺少或损坏错误...
"I've been playing around with this all day and there was no way I could get Launch4J to include the JRE in the .exe file. Really poor in my opinion, as their documentation does not seem to allude to this issue at all."[Files]
部分)的行是:Source: "M:\Netbeans\MyApp\jre6\*"; DestDir: "{app}\jre6\"; Flags: recursesubdirs createallsubdirs
我用了一些绕路的方法,但是它解决了问题。
重复以上步骤,你应该就可以解决问题了。
将JRE打包成EXE的简单方法是使用Lanch4j打包器中提供的Wrap工具。
warp-packer --arch windows-x64 --input_dir mycrt --exec run.bat --output single.exe
在启动exe文件后停止命令行窗口。
editbin /subsystem:windows
warp: https://github.com/dgiagio/warp
editbin:由VS安装
演示:
Inno Setup的打包JRE解决方案
为了实现应用程序jar的JRE捆绑解决方案,我创建了一个Inno Setup脚本,该脚本:
1)将JRE复制到安装exe文件中
2)使用捆绑的JRE执行相当于终端命令:java -jar myjar.jar
首先,我将JRE复制:
#define MyJREPath "C:\Program Files\Java\jre1.8.0_191"
[Files]
Source: "{#MyJREPath}\*"; DestDir: "{app}\runtime\jre\"; \
Flags: ignoreversion recursesubdirs createallsubdirs;
[Run]
Filename: "{app}\runtime\jre\bin\javaw.exe"; Parameters: " -jar myjar.jar"; \
WorkingDir: "{app}\app\"; \
Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; \
Flags: postinstall skipifsilent
[Icons]
Name: "{commondesktop}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\javaw.exe"; \
Parameters: " -jar myjar.jar"; \
WorkingDir: "{app}\app\"; \
Tasks: desktopicon
[Tasks]
Name: "desktopicon"; \
Description: "{cm:CreateDesktopIcon}"; \
GroupDescription: "{cm:AdditionalIcons}"; \
Flags: unchecked
#if MyJREPath != ""
; bundled JRE required
#else
; bundled JRE not required
#endif
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
; some more #defines here
#define MyAppExeName "javaw.exe"
#define MyJREPath "C:\Program Files\Java\jre1.8.0_191"
;#define MyJREPath ""
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId=XXXXXXXXXX
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultGroupName={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyDefaultDirName}
DisableProgramGroupPage=yes
LicenseFile={#MyInnoSetupDir}\system\{#MyLicenseFile}
OutputDir={#MyInnoSetupDir}
#if MyJREPath != ""
; run app with bundled JRE
OutputBaseFilename={#MyAppName}-{#MyAppVersion}-bundledJRE-setup
#else
; run app without bundled JRE
OutputBaseFilename={#MyAppName}-{#MyAppVersion}-setup
#endif
SetupIconFile={#MyInnoSetupDir}\{#MyAppIcoName}
Compression=lzma
SolidCompression=yes
AppComments={#MyAppName}
AppCopyright={#MyAppCopyright}
UninstallDisplayIcon={#MyInnoSetupDir}\{#MyAppIcoName}
UninstallDisplayName={#MyAppName}
WizardImageStretch=No
WizardSmallImageFile={#MyInnoSetupDir}\{#MyAppBmpName}
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
;Name: "german"; MessagesFile: "compiler:Languages\German.isl"
[Tasks]
Name: "desktopicon"; \
Description: "{cm:CreateDesktopIcon}"; \
GroupDescription: "{cm:AdditionalIcons}"; \
Flags: unchecked
Name: "quicklaunchicon"; \
Description: "{cm:CreateQuickLaunchIcon}"; \
GroupDescription: "{cm:AdditionalIcons}"; \
Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
; bundle JRE if required
#if MyJREPath != ""
Source: "{#MyJREPath}\*"; DestDir: "{app}\runtime\jre\"; \
Flags: ignoreversion recursesubdirs createallsubdirs;
#endif
; copy jar and all files
Source: "{#MyInnoSetupDir}\*"; DestDir: "{app}\app\"; \
Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
#if MyJREPath != ""
; set up icons with bundled JRE
Name: "{commonprograms}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; \
Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"
Name: "{commondesktop}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; \
Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; \
Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: quicklaunchicon
#else
; set up icons without bundled JRE
Name: "{commonprograms}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"
Name: "{commondesktop}\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; \
IconFilename: "{app}\app\{#MyAppIcoName}"; \
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Tasks: quicklaunchicon
#endif
[Run]
#if MyJREPath != ""
; run app with bundled JRE
Filename: "{app}\runtime\jre\bin\{#MyAppExeName}"; Parameters: " -jar {#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; \
Flags: postinstall skipifsilent
#else
; run app without bundled JRE
Filename: "{app}\app\{#MyJarName}"; \
WorkingDir: "{app}\app\"; \
Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; \
Flags: shellexec postinstall skipifsilent
#endif
我从未使用过Launch4J产品,祝你成功地配置它。
看起来你可以去Sourceforge的讨论论坛寻找其他提示 这里
其他建议:
我见过的IBM(Websphere)和Oracle的大多数产品只是在安装目录下提取一个JRE,并配置启动批处理命令以使用已安装的JRE。实际上,JRE和您的jar文件将在一次安装中安装。
安装exe通常会检查是否已经安装,并在发现已经存在时跳过该步骤。这对于仅升级jar文件非常有用。
本地安装还解决了客户安装其自己的可能不兼容或包含错误的JRE的问题。这样,您就可以处理已知的JRE版本。
如果您的应用程序没有图形组件,则选择excelsior路线是可以的(已经有一段时间,此限制可能已更改)。还有其他限制,但您最好只需使用单个可执行安装程序分发JRE及代码。
看起来你需要本地代码编译器。这些编译器生成本地代码,不需要JRE。
http://docs.oracle.com/javase/tutorial/deployment/webstart/index.html
有几个原因导致launch4j无法顺利运行。其中一些原因是:
1)用户未以管理员身份运行应用程序
2)用户未正确设置图标图像。必须严格使用.ico格式。
.jpg
图标,这导致了上述的 JRE
错误。 - Ebraheem Alrabeea