IT-Swarm.Net

Wie bündle ich eine JRE in einer EXE-Datei für eine Java-Anwendung? Launch4j sagt, "Laufzeit fehlt oder ist beschädigt."

Ich bin neu in der Programmierung in Java, weiß aber im Allgemeinen, wie alles funktioniert. Ich möchte in der Lage sein, sowohl eine JAR-Datei als auch eine JRE-Datei in eine ausführbare Windows-Datei (Exe) zu packen, so dass der Client bei der Verteilung keine JRE-Komponente installiert haben muss. Welches Programm soll ich verwenden? 

Ich habe launch4j und scheint genau das zu tun, was ich will, aber wenn ich versuche, die App auszuführen, bekomme ich "Diese Anwendung wurde für die Verwendung einer gebündelten Java-Laufzeitumgebung konfiguriert, die Laufzeit fehlt oder ist jedoch beschädigt." 

Ich möchte, dass meine App nur ein lauffähiges Programm ist, kein Installer. Kann mir wenigstens jemand zeigen, wie man eine JRE richtig mit launch4j bündelt?

23
MagicGuy52

Die einzige Möglichkeit, eine JRE zu bündeln, war die Verwendung von Launch4J und Inno Setup Compiler .

Erstellen Sie zunächst einen jre6-Ordner (zum Beispiel) in demselben Verzeichnis wie Ihre Ausgabedatei (.exe).

Kopieren Sie dann die JRE von Ihrem System in Ihren Ordner jre6.

Dann öffnen Sie Launch4J und legen den Bundled JRE-Pfad fest - geben Sie einfach jre6 ein. Klicken Sie dann auf die Schaltfläche Erstellen (natürlich nachdem Sie alle anderen Parameter eingegeben haben. Der einzige Wert, den Sie auf der Registerkarte JRE selbst eingeben müssen, ist der Wert Bundled JRE path.)

Ich hätte erwartet, dass dies funktioniert, aber wenn Sie dann die .exe-Datei an einen neuen Speicherort verschieben (damit sie sich nicht mehr in Ihrem Ordner jre6 befindet), erhalten Sie die Diese Anwendung wurde für die Verwendung konfiguriert eine gebündelte Java-Laufzeitumgebung, deren Laufzeit jedoch fehlt oder beschädigt ist Fehler, wenn Sie versuchen, die Anwendung auszuführen ...

Ich habe den ganzen Tag damit herumgespielt und es gab keine Möglichkeit, dass ich Launch4J erhielt, um die JRE in die EXE-Datei aufzunehmen. Wirklich arm meines Erachtens, da ihre Dokumentation überhaupt nicht auf dieses Thema zu verweisen scheint.

Was ich also lösen wollte, war Inno Setup Compiler (ISC) zu verwenden. Diese App wird verwendet, um die EXE-Datei als Windows Installer-Datei einzuhüllen. Also habe ich dem ISC-Skript eine Einstellung hinzugefügt, die die JRE in das Installationspaket kopiert. Die Zeile, die ich dem Skript (im Abschnitt [Files]) hinzugefügt habe, war:

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

... ein bisschen Workaround, aber es hat den Trick gebracht.

Wiederholen Sie alle obigen Schritte, und Sie sollten sortiert sein.

32

Es ist einfach, Jre in launch4j zu bündeln .. 

kopieren Sie einfach den Ordner in den gleichen Ausgabeordner

Geben Sie im Textfeld für die Bundle-Jre-Umgebung einfach den JRE-Ordner an

Geben Sie im Textfeld der Umgebungsvariablen (auf derselben Seite unten) bis bin ab

Dann erstellen Sie exe .. Es funktioniert wie erwartet ohne JRE in der Maschine.

Vielen Dank

1
Nivedha

Ich habe das Launch4J-Produkt noch nie verwendet. Viel Glück bei der korrekten Konfiguration.

Sie können anscheinend in das Diskussionsforum von Sourceforge gehen, um weitere Hinweise zu erhalten. Hier

Andere Vorschläge: 

Die meisten Produkte, die ich von IBM (Websphere) und Oracle gesehen habe, extrahieren einfach eine JRE unter dem Installationsverzeichnis und konfigurieren den Startbefehl, um die installierte JRE zu verwenden. Im Wesentlichen würden die JRE und Ihre JAR-Datei auf einmal installiert. 

Das Installations-Exe prüft normalerweise, ob es bereits installiert ist, und überspringt diesen Schritt, wenn es bereits vorhanden ist. Dies ist nützlich, wenn Sie nur die JAR-Datei aktualisieren möchten. 

Durch die lokale Installation wird auch das Problem gelöst, dass der Kunde eine eigene JRE installiert, die möglicherweise nicht kompatibel ist oder Fehler enthält. So können Sie mit einer bekannten JRE-Version umgehen. 

Die überlegene Route ist in Ordnung, wenn Sie keine grafische Komponente in Ihrer Anwendung haben (es ist eine Weile her, dass sich die Einschränkung geändert hat). Es gibt auch andere Einschränkungen, aber es ist wahrscheinlich besser, wenn Sie eine JRE mit Ihrem Code in einem einzigen ausführbaren Installationsprogramm verteilen. 

1
Mike

Gebündelte JRE-Lösung für das Inno-Setup

Um eine gebündelte JRE-Lösung mit einer Anwendungsjar zu implementieren, habe ich ein Inno Setup-Skript erstellt, das:

1) kopiert die JRE in das Installationsexe

2) führt das Äquivalent des Terminalbefehls aus: Java -jar myjar.jar unter Verwendung der mitgelieferten JRE

Zuerst kopiere ich die JRE:

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

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

Ich befolge die hier gezeigte Verzeichnisstrukturkonvention: https://docs.Oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html

Um das Äquivalent von Java -jar myjar.jar auszuführen:

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

(n.b. Java.exe läuft mit einem Terminal und javaw.exe läuft ohne Terminal)

Desktop-Verknüpfung muss den richtigen Dateinamen, die richtigen Parameter und das richtige Arbeitsverzeichnis haben:

[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

Für das i-Tüpfelchen, damit mein Skript sowohl gebündelte JRE als auch keine gebündelten Optionen behandelt Ich verwende die Präprozessor-IF-Anweisung (in jedem Skriptabschnitt dupliziert), um zu testen, ob das Skript einen ___ leeren MyJREPath enthält oder nicht . Wenn MyJREPath nicht leer ist und daher eine gebündelte JRE-Lösung erforderlich ist, benutze ich die obige Codierung. Wenn alternativ keine gebündelte Lösung erforderlich ist dann verwende ich mehr "normale" Codierung, die in den Inno Setup-Beispielen gezeigt oder von ihrem Assistenten generiert wird. Hier ist die IF-Anweisung:

#if MyJREPath != ""
    ; bundled JRE required

#else
    ; bundled JRE not required
#endif

Hier ist das meiste meines Skripts zusammen:

        ; 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 

Hoffe das hilft.

0
David Miller

Es scheint, dass Sie einen nativen Code-Compiler benötigen. Diese Compiler erzeugen nativen Code, für den kein JRE erforderlich ist.

Überprüfen Sie diesen Artikel - https://www.excelsior-usa.com/articles/Java-to-exe.html#aot

0
tcb