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?
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é.
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
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.
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.
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 .