如何捆绑一个JRE到Java应用程序的一个EXE? Launch4j说:“运行时丢失或损坏。”(

2019-07-17 12:19发布

我是新来的Java编程,但我基本熟悉了如何一切正常。 我希望能够把两个jar文件和JRE到一个Windows可执行文件(exe文件),所以,当我分发,客户端无需安装了JRE。 我应该使用什么程序?

我已经launch4j,似乎做我想要什么,但是当我尝试运行应用程序,我得到“该应用程序被配置为使用捆绑的Java运行时环境,但运行时丢失或损坏。”

我想我的应用程序仅仅是一个可运行的exe文件,而不是一个安装程序。 最起码,谁能告诉我如何正确地捆绑与launch4j一个JRE?

Answer 1:

我可以捆绑一个JRE的唯一方法是使用Launch4J和Inno Setup的编译器 。

首先,创建一个jre6在同一个目录文件夹(例如)作为输出文件(.exe)。

然后从系统中复制JRE到你JRE6文件夹。

然后,你打开Launch4J并设置捆绑JRE路径 -只要输入jre6 。 然后单击生成按钮(当然,您输入的所有其它参数之后-但你需要JRE选项卡本身进入唯一的价值是捆绑JRE路径值。)

我本来期望的是工作,但如果你再移动.exe文件到新的位置(所以它不再是协同定位与JRE6文件夹),你得到的这个应用程序被配置为使用捆绑的Java运行时环境,但当您尝试运行该应用程序运行时丢失或损坏错误...

我整天都在玩弄这一点,没有办法,我能得到Launch4J包括了JRE中的.exe文件。 在我看来,真正的穷人,因为他们的文件似乎并没有暗示这个问题的。

所以我做了什么来解决是使用Inno Setup的编译器(ISC)。 这个程序是用来包住您的.exe为Windows Installer文件。 所以我增加了一个设置在ISC脚本复制到JRE的安装包。 我添加到脚本的线(在[Files]段)为:

Source: "M:\Netbeans\MyApp\jre6\*"; DestDir: "{app}\jre6\"; Flags: recursesubdirs createallsubdirs

...有点变通方法,但它的伎俩。

重复上述所有步骤,你应该进行排序。



Answer 2:

我从来没有使用Launch4J产品,好运气得到它正确配置。

看起来你也许可以去论坛Sourceforge上其他提示这里

其它建议:

大多数我从IBM(的Websphere)和Oracle看到的产品只是解压缩安装目录下的JRE和配置启动批处理命令使用已安装JRE。 本质上,JRE和JAR文件将被安装在一杆。

安装exe文件通常会检查是否已安装,并跳过这一步,如果发现它已经存在。 这是刚刚jar文件的升级有用。

具有本地安装也解决了客户的安装自己的JRE的问题,它可能不兼容或包含错误。 这样,你的处理与已知的JRE版本。

Excelsior酒店的路线是确定的,如果你没有一个图形组件到应用程序(它已经有一段时间,该限制可能有变化)。 还有其他的限制,同时,但你可能只是关闭只是在一个单一的可执行安装程序分发JRE与您的代码更好。



Answer 3:

看来你需要本地代码编译器。 这些编译器产生本地代码不需要JRE。

检查这篇文章- https://www.excelsior-usa.com/articles/java-to-exe.html#aot 。



Answer 4:

它很容易捆绑JRE到launch4j ..

只是JRE复制到相同的输出文件夹

在包JRE环境文本框中,只是给了JRE文件夹本身

在环境变量文本框(存在于下同页),给直到斌

然后创建EXE ..它按预期工作没有机器JRE。

谢谢



Answer 5:

捆绑JRE解决方案Inno Setup的

为了实现与应用程序的jar捆绑JRE的解决方案,我创建了一个Inno Setup的脚本:

1)复制JRE入安装的exe

2)执行终端命令的当量:Java的罐子myjar.jar使用捆绑JRE

首先,我复制JRE:

#define MyJREPath "C:\Program Files\Java\jre1.8.0_191"

[Files]
Source: "{#MyJREPath}\*"; DestDir: "{app}\runtime\jre\";  \
        Flags: ignoreversion recursesubdirs createallsubdirs;  

我按照显示的目录结构,约定在这里: https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html

要运行Java的罐子myjar.jar相当于:

[Run]
Filename: "{app}\runtime\jre\bin\javaw.exe"; Parameters: " -jar myjar.jar"; \
          WorkingDir: "{app}\app\"; \
          Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; \
          Flags: postinstall skipifsilent   

(NB的java.exe与终端运行并javaw.exe的无终端运行)

桌面快捷方式需要有正确的文件名,参数和工作目录:

[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

有关锦上添花,为了让我的脚本处理这两个捆绑的JRE并没有捆绑选项我使用预处理IF语句(在每个脚本部分重复)来测试脚本是否有一个空MyJREPath与否。 如果MyJREPath不为空的,因此需要一个捆绑的JRE溶液我使用上面的编码; 可替代地,如果不需要捆绑溶液然后我使用更多的“正常”编码所示的创新安装实施例或可以通过向导生成。 这里的IF语句:

#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 

希望这可以帮助。



Answer 6:

该简单的方法来封装JRE到EXE,它lanch4j包装是使用包裹物。

warp-packer --arch windows-x64 --input_dir mycrt --exec run.bat --output single.exe

然后停止CMD窗口时推出的EXE。

editbin /subsystem:windows

: https://github.com/dgiagio/warp

EDITBIN:通过安装VS

演示:



Answer 7:

什么你问是不是一件容易的事做(如果这是可行的。)如果我是你,我会考虑建立一个可执行的JAR文件:

Java的Eclipse中创建可执行的JAR

另一种选择是使用Java Web Start的。 这是假设你使用最新的浏览器的JNLP会自动提示用户安装Java的正确版本。

http://docs.oracle.com/javase/tutorial/deployment/webstart/index.html



Answer 8:

有几个原因,launch4j不会平稳运行。 一些原因是:

1)用户不要运行该应用程序作为管理员

2)用户没有设置图标图像正常。 必须严格.ICO



文章来源: How do I bundle a JRE into an EXE for a Java Application? Launch4j says “runtime is missing or corrupted.”