1
votes

Comment exécuter une image d'exécution Java générée par jlink sans fenêtre CMD?

J'ai créé une image d'exécution Java pour une simple application OpenJFX. Afin d'exécuter cette application, jlink a généré automatiquement deux scripts de lancement dans le répertoire % image_path% / bin . Voici à quoi il ressemble (celui pour Windows):

@echo off
set JLINK_VM_OPTIONS=
set DIR=%~dp0
"%DIR%\java" %JLINK_VM_OPTIONS% -m app/com.package.Launcher %*

Évidemment, lorsque j'exécute ce fichier batch, il ouvre une nouvelle fenêtre shell, ce qui n'est pas ce que je veux. J'ai essayé toutes les approches courantes: utilisez javaw au lieu de java , exécutez le script via la commande start etc. Rien ne fonctionne.

Est-il possible d'éviter la fenêtre shell ou de créer en quelque sorte un lanceur natif?


1 commentaires

Si vous utilisiez JavaFX 9 ou 10, vous pouvez utiliser l'outil javapackager . Puisque vous ne l'êtes pas, vous devrez attendre JEP 343: Packaging Tool (voir également JDK-8212780 ) qui fournira un nouvel outil nommé jpackage ( précédemment nommé jpackager ).


4 Réponses :


1
votes

Ok, j'ai compris qu'il n'est pas possible d'éliminer complètement la fenêtre shell. Dans le meilleur scénario, il scintille juste pendant ~ 1sec. Voici comment cela peut être réalisé:

@echo off
set JLINK_VM_OPTIONS=
set DIR=%~dp0
start "" "%DIR%\javaw" %JLINK_VM_OPTIONS% -m app/com.package.Launcher %* && exit 0

Il y a une demande de fonctionnalité concernant implémentation du lanceur natif mais ce n'est pas discuté activement.

Néanmoins, j'ai résolu le problème. Il existe un outil "Batch to EXE Converter". Il peut générer un exécutable (essentiellement le même fichier batch) qui peut exécuter votre application en silence.


3 commentaires

Pourriez-vous s'il vous plaît ajouter un lien vers l'outil "Batch to EXE Converter"?


@PerdiEstaquel peut-être qu'Evan voulait dire ceci: battoexeconverter.com ?


Mieux vaut utiliser JDK_JAVA_OPTIONS au lieu de JLINK_VM_OPTIONS car il est interne à la JVM pour l'exécuter - docs.oracle.com/javase/9/tools/java.htm#JSWOR624



0
votes

Cela semble possible en utilisant vbscript. Si vous mettez le script suivant dans un fichier .vbs à côté du fichier launcher.bat (ou quel que soit le nom du fichier batch):

CreateObject("Wscript.Shell").Run CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\launcher.bat " & WScript.Arguments(0) & " > " & CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\launch-log.log", 0, False

Ceci exécute le fichier batch dans le même répertoire , et redirige également stdout vers un fichier journal.


0 commentaires

0
votes

Ce que vous aimeriez réaliser est très bien possible. C'est en fait même assez facile et je l'utilise tous les jours. Une version à accès anticipé de jpackage est déjà disponible ici: http://jdk.java.net/jpackage/ < / a> La création d'exécutables fonctionne déjà joliment (je l'utilise sur Mac et Windows). Créer uniquement des installateurs est encore un peu problématique.


0 commentaires

0
votes

Il est très facile d'exécuter un fichier bat sans afficher la fenêtre cmd. il vous suffit de créer un fichier VBS pour exécuter le fichier bat avec le cmd suivant

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & ".\bin\launcher.bat" & Chr(34), 0
Set WshShell = Nothing

Enregistrez cmd dans le fichier hors du dossier bin avec un nom comme Launcher.vbs.


0 commentaires