web-dev-qa-db-fra.com

Comment intégrer un JRE dans un fichier EXE pour une application Java? Launch4j dit que "le moteur d'exécution est manquant ou corrompu".

Je suis novice en programmation Java, mais je suis généralement familiarisé avec le fonctionnement de tout. J'aimerais pouvoir insérer à la fois un fichier jar et un jre dans un exécutable Windows (exe) afin que, lorsque je le distribue, le client n'ait pas besoin d'installer un JRE. Quel programme devrais-je utiliser? 

J'ai launch4j et il semble faire exactement ce que je veux, mais lorsque j'essaie d'exécuter l'application, je reçois le message "Cette application a été configurée pour utiliser un environnement d'exécution Java fourni, mais l'exécution est manquante ou corrompue." 

Je veux que mon application soit juste un exécutable, pas un installateur. À tout le moins, quelqu'un peut-il me montrer comment associer correctement un environnement JRE à launch4j?

23
MagicGuy52

Le seul moyen de regrouper un JRE était d'utiliser Launch4J et Inno Setup Compiler .

Commencez par créer un dossier jre6 (par exemple) dans le même répertoire que votre fichier de sortie (.exe).

Copiez ensuite le JRE de votre système dans votre dossier jre6.

Ensuite, vous ouvrez Launch4J et définissez le chemin d'accès JRE Bundled - saisissez simplement jre6. Cliquez ensuite sur le bouton Construire (bien sûr, après avoir entré tous les autres paramètres, mais la seule valeur que vous devez entrer dans l'onglet JRE est la valeur Bundled JRE path.)

Je pensais que cela fonctionnerait, mais si vous déplacez ensuite le fichier .exe vers un nouvel emplacement (il ne se trouve donc plus au même emplacement que votre dossier jre6), vous obtenez le cette application a été configurée pour utiliser un environnement d'exécution Java fourni, mais le moteur d'exécution est manquant ou corrompu} erreur lorsque vous essayez d'exécuter l'application ...

J'ai joué avec cela toute la journée et je ne pouvais absolument pas obtenir Launch4J inclure le JRE dans le fichier .exe. Vraiment médiocre à mon avis, car leur documentation ne semble pas du tout faire allusion à cette question.

Donc, ce que j'ai fait pour résoudre était d'utiliser Inno Setup Compiler (ISC). Cette application est utilisée pour envelopper votre fichier .exe en tant que fichier Windows Installer. J'ai donc ajouté un paramètre au script ISC qui copie le JRE dans le package d'installation. La ligne que j'ai ajoutée au script (dans la section [Files]) était la suivante:

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

... un peu de solution de contournement, mais ça a fait l'affaire.

Répétez toutes les étapes ci-dessus et vous devriez être trié.

32
ban-geoengineering

Il est facile à intégrer jre dans launch4j .. 

il suffit de copier le jre dans le même dossier de sortie

Dans la zone de texte Bundle jre environment, indiquez simplement le dossier jre

Dans la zone de texte de la variable d’environnement (présente dans la même page ci-dessous), indiquez jusqu’à bin

Ensuite, créez exe .. Cela fonctionne comme prévu sans jre dans la machine.

Merci

1
Nivedha

Je n'ai jamais utilisé le produit Launch4J, bonne chance pour le configurer correctement.

On dirait que vous pourriez peut-être aller au forum de discussion sur Sourceforge pour d'autres astuces ici

Autres suggestions: 

La plupart des produits IBM (Websphere) et Oracle que j'ai vus ne font qu'extraire un JRE sous le répertoire d'installation et configurer la commande de démarrage par lots de manière à utiliser le JRE installé. Essentiellement, le JRE et votre fichier JAR seraient installés en une fois. 

Le programme d'installation vérifie généralement s'il est déjà installé et ignore cette étape s'il le trouve déjà. Ceci est utile pour les mises à niveau du fichier jar uniquement. 

Avoir l’installation locale résout également le problème de l’installation par le client de son propre JRE, qui peut être incompatible ou contenir des erreurs. De cette façon, vous avez affaire à une version JRE connue. 

La route excelsior est acceptable si vous n'avez pas de composant graphique dans votre application (cela fait longtemps, cette restriction peut avoir changé). Il existe également d'autres restrictions, mais il est probablement préférable de simplement distribuer un JRE avec votre code dans un seul programme d'installation exécutable. 

1
Mike

Solution JRE intégrée pour la configuration Inno

Afin de mettre en œuvre une solution JRE intégrée avec un fichier jar, j'ai créé un script Inno Setup qui:

1) copie le JRE dans l'exe d'installation

2) exécute l'équivalent de la commande de terminal: Java -jar myjar.jar à l'aide du JRE fourni

Tout d'abord je copie le JRE:

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

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

Je suis la convention de structure de répertoire indiquée ici: https://docs.Oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html

Pour exécuter l'équivalent de Java -jar 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   

(n.b. Java.exe s'exécute avec un terminal et javaw.exe s'exécute sans terminal)

Le raccourci sur le bureau doit avoir les bons nom de fichier, paramètres et répertoire de travail:

[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

Cerise sur le gâteau, pour que mon script gère à la fois le JRE fourni et les options non fournies .__, j'utilise l'instruction IF du préprocesseur (dupliquée dans chaque section de script) pour vérifier si le script contient un. . Si MyJREPath n’est pas vide et qu’une solution JRE groupée est donc nécessaire, j’utilise le codage ci-dessus; sinon, si une solution groupée n’est pas nécessaire , j’utilise un codage plus "normal" illustré dans les exemples de configuration Inno ou généré par leur assistant. Voici la déclaration IF:

#if MyJREPath != ""
    ; bundled JRE required

#else
    ; bundled JRE not required
#endif

Voici l'essentiel de mon script mis en place:

        ; 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 

J'espère que cela t'aides.

0
David Miller

Il semble que vous ayez besoin d'un compilateur de code natif. Ces compilateurs produisent du code natif qui ne nécessite pas JRE.

Consultez cet article - https://www.excelsior-usa.com/articles/Java-to-exe.html#aot

0
tcb