web-dev-qa-db-fra.com

Comment ouvrir un fichier .jar JavaFX avec JDK 11?

J'ai créé un projet JavaFX dans IntelliJ. Je peux exécuter un projet dans IntelliJ. J'ai ajouté le code ci-dessous dans les configurations):

--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml

Mais le fichier .jar de sortie du projet (créé avec Artifects) ne s'exécute pas. J'ai testé ces commandes, mais je n'ai eu aucune chance:

Java  --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
Java  --module-path %PATH_TO_FX% --add-modules javafx.controls  Timer.jar

Dernier journal des erreurs de la ligne de commande:

Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: Java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib

p.s: je pourrais exécuter le fichier .jar de ce projet lors de la construction sur JDK-10

MODIFIER :

J'ai téléchargé JavaFX et ajouté son dossier lib aux environnements système. pour ajouter JavaFX au projet, j'ai fait ce processus: Structure du projet> Bibliothèques> ajouter> Java> JavaFxPath/lib

J'ai ensuite créé Artifect pour le fichier jar de sortie dans ce processus: Structure du projet> Artifects> Ajouter> JAR> À partir de modules avec dépendances> Classe principale: main.Main.

8
DrMorteza

Si vous disposez d'un projet JavaFX 11 simple (non modulaire) (sans outils de construction Maven/Gradle) et que vous utilisez IntelliJ, comme l'exemple HelloFX de ici , voici comment vous pouvez créer un bocal d'IntelliJ qui peut être exécuté à partir de la console

Un tutoriel complet sur la façon d'exécuter le projet peut être trouvé ici , et des instructions sur la façon de créer un bocal sont ici (voir la section Projet non modulaire), mais ceux-ci ne le font pas ne couvre pas Artifacts d'IntelliJ.

Vérifiez que le projet HelloFX s'exécute à partir d'IntelliJ avec ces options VM:

--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml

PATH_TO_FX a été défini dans File -> Settings -> Appearance & Behavior -> Path Variables, pointant vers JavaFX SDK lib.

Semi gros pot

Nous pouvons créer un Jar qui contient uniquement les classes du projet et les dépendances tierces, mais pas celles JavaFX.

Aller à File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies, ajoutez votre classe principale, acceptez.

Ensuite supprimez les jarres JavaFX de la liste et acceptez.

SemiJar

Générez le projet, il créera un pot assez petit (3 Ko dans ce cas).

Vous devriez maintenant pouvoir l'exécuter comme:

Java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar out\artifacts\HelloFX_jar\HelloFX.jar

(sois sûr que %PATH_TO_FX% pointe vers un dossier valide et utilise des guillemets s'il contient des espaces.

Vous pouvez distribuer ce pot et l'exécuter sur d'autres plates-formes, à condition que celles-ci disposent également du SDK JavaFX.

Pot de graisse

Si vous voulez un bocal complet contenant des dépendances JavaFX, vous pouvez toujours utiliser des artefacts.

Aller à File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies, ajoutez votre classe principale, acceptez.

Alors conservez les jarres JavaFX dans la liste, et acceptez. Générez le projet.

En théorie, vous devriez pouvoir l'exécuter comme:

Java -jar out\artifacts\HelloFX_jar\HelloFX.jar

Mais cela ne fonctionnera pas.

Raison 1: Vous avez besoin d'une classe de lancement, comme expliqué ici .

Créez donc une classe de lancement:

public class Launcher {

    public static void main(String[] args) {
        Main.main(args);
    }
}

Raison 2: Si vous ajoutez uniquement vos pots SDK au gros pot, vous manquerez les bibliothèques natives, comme expliqué ici .

Modifiez donc l'artefact, sélectionnez la classe Launcher comme classe principale et ajoutez les bibliothèques natives (Directory Content -> path-to/JavaFX SDK/bin sous Windows):

Fat Jar

Maintenant, construisez le projet (maintenant le pot fait environ 33 Mo et contient des bibliothèques natives inutiles) et exécutez:

Java -jar out\artifacts\HelloFX_jar\HelloFX.jar

Vous pouvez distribuer ce pot, mais uniquement sur les plateformes Windows.

Vous pouvez créer des fichiers JAR similaires pour d'autres plates-formes, si vous téléchargez leurs SDK JavaFX, et vous pouvez également créer des fichiers JAR multi-plateformes si vous les ajoutez tous ensemble, comme expliqué dans les réponses liées ci-dessus.

Quoi qu'il en soit, vous devriez envisager d'utiliser jlinkà la place .

Remarque

À propos de cette erreur:

Provoqué par: Java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib

il semble que le chemin de la bibliothèque ait été défini sans guillemets et il manque la première partie du chemin C:\Program Files\.... Assurez-vous simplement d'utiliser des guillemets:

set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"
9
José Pereda

J'ai eu le même problème lors de l'exportation/génération d'un Jar à l'aide de JavaFX et IntelliJ non modulaire avec Gradle ( https://openjfx.io/ openjfx-docs / )

Le bocal que je générais à l'aide de la commande Gradle jar ne s'exécute pas et génère une erreur indiquant qu'il ne trouve pas ma classe principale. Quand j'ai ouvert mon pot, j'ai pu localiser ma classe principale. J'ai donc réalisé que l'erreur était liée à l'emballage des pots.

enter image description here

J'ai résolu le problème en ajoutant JavaFX SDK à mon Java SDk dans IntelliJ comme indiqué ci-dessous.

enter image description here

Après cela, j'utilise la commande régulière Gradle build Jar pour générer mon fichier Jar (comme indiqué ci-dessous) et il fonctionne normalement.

enter image description here

2
Sai Haridass