Javapackager

Résolu/Fermé
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023 - 20 nov. 2021 à 21:36
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023 - 27 nov. 2021 à 12:03
Bonjour.
Je n'arrive pas à utiliser le javapackager qu'on (sans doute vous) m'avez conséillé il y a une quinzaine de jours (en Java 8). Dans mon jdk j'ai bien un javapackager.exe, mais, malgré ce que je lis sur Oracle, je n'arrive pas à m'en servir. A quel niveau dois_je l'utiliser/
1. soit en ajoutant en tête de mon programme : import quelquechose
2 soit à la compilation par ./javac monprogramme.java
3 soit à la fabrication du .jar par ./jar cvmf MANIFEST.MF monprogramme.class monprog.*class
4 soit à la première application par ./java -jar monprogramme.jar
5 soit encore par une ligne de commande indépendante.
Je pense que c'est sans doute dans les points 2 ou 3 que je devrais intervenir
D'avance merci!

6 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 21 nov. 2021 à 09:02
Bonjour,

La réponse est 5.

Je t'invite à tester d'abord sur un programme simple, genre ce HelloWorld.
https://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java

Important : il faut que le code soit dans un dossier "src". Ici tu aurais donc src/start/HelloWorldSwing.java
En ligne de commandes tu vas jusqu'au dossier qui contient le répertoire "src" et tu exécutes la commande :
javapackager -makeall -appclass start.HelloWorldSwing -name HelloWorld

Cela va te créer beaucoup de choses (c'est le makeall), tout ne t'intéressera pas forcément, il y aura aussi des warning de choses qu'il aura essayé de faire mais qui nécessitent d'autres logiciels sur ton PC (genre WIX ou InnoSetup, à voir ultérieurement si tu veux t'en servir), mais de base tu vas notamment avoir un dossier dist\bundles\HelloWorld avec un HelloWorld.exe un app/dist.jar et plein d'autres fichiers qui correspondent à la copie de ton JRE.

En lançant le .exe ce sera comme lancer le jar depuis le JRE copié.

Si besoin tu peux te référer à la documentation pour ajouter des options complémentaires :
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javapackager.html
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
Modifié le 22 nov. 2021 à 15:17
Bonjour XK
J'ai essayé de faire tout comme tu l'as préconisé: un HelloWord.java dans mon répertoire JDK../bin/src, compilé (avec donc la classe Hellworld.class, puis ta ligne de commande:
javapackager -makeall -appclass start.HelloWorldSwingProject -name HelloWorld
dans mon JDK../bin. Cela m'a en effet donné beaucoup de choses, dont trois réperoires: JDK../bin/dist, JDK../bin/dist/bundles et JDK../bin/dist/bundles/helloworld; et dans ce dernier j'ai bien un HelloWorld.exe, mais si je double clique sur son incone, j'obtiens: Class start/HelloworldSwing not found
J'ai bien créé dans mon répertoire JDK../bin un répertoire intitulé start mais je ne sais pas quoi mettre dedans (quel élément HelloWorldSwingProject).
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 22 nov. 2021 à 17:28
J'ai pris pour exemple cette classe start.HelloWorldSwing :
https://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java

Class start/HelloworldSwing not found
Le w devrait être en majuscule dans la ligne de commandes, pas en en minuscule :
-appclass start.HelloWorldSwing
Pour correspondre au nom de la classe dans le code :
public class HelloWorldSwing
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
22 nov. 2021 à 18:19
Dans le ligne de commande, faite en copier/collé de ta ligne, il y avait bien un W majuscule, et ce n'est que quand j'ai recopié à la main la sentence que j'ai mis un w, ne prenant pas trop au sérieux la case (ce qui est un tort, je l'avoue et je te prie de m'en excuser). En tous cas, j'ai vérifié que j'ai bien partout des W et non des w, dans la classe HelloWorld de src aussi bien que dans la ligne que tu préconises.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
22 nov. 2021 à 19:01
"dans la classe HelloWorld de src"
Ça c'est ton code, du coup il faut adapter la commande avec le nom de ta classe, sachant que ça ne fonctionnera pas si tu n'as pas d'interface graphique, c'est pour ça que je te proposais un code HelloWorld en Swing déjà tout fait, tu avais juste à copier coller...
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
23 nov. 2021 à 09:00
Bonjour KX,
Je vois bien que si mon source de jdk8../bin/src s'appelle toto.java je devrai mettre dans ma ligne de commande start.totoSwing, mais cela ne m'explique pas ce que je dois mettre au début dans ce répertoire jdk8../bin/start, puisqu'on me dit:
Class start/HelloworldSwing not found

1. Est-ce un copier/collé de jdk8../bin/src/HelloWord.class
2.Une classe vide du nom de HelloWord.class?
3. Autre chose?
D'autre part, j'ai fait un répertoitre nommé start dans jdk8../bin/ , est-ce bien l'endroit où le faire?
Merci pour votre aide, je crois que je ne suis pas loin du résultat!
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 nov. 2021 à 09:10
"Je vois bien que si mon source de jdk8../bin/src s'appelle toto.java je devrai mettre dans ma ligne de commande start.totoSwing"
Bah non, si c'est toto.java tu mets juste toto

Ouvre l'exemple : https://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java
C'est une classe HelloWorldSwing dans un package start, donc tu enregistres son contenu dans un fichier HelloWorldSwing.java dans un répertoire start.

Sans parler de javapackager pour l'instant, si tu veux compiler et exécuter cette classe tu devrais faire
javac start/HelloWorldSwing.java
puis
java start.HelloWorldSwing
ce qui devrait fonctionner, c'est la base.

Maintenant c'est à peine plus compliqué de dire que la nouvelle commande c'est :
javapackager -makeall -appclass start.HelloWorldSwing -name HelloWorld

C'est le même paramètre à lui donner, on a juste besoin de savoir quelle est la classe qui contient la méthode main.
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
Modifié le 23 nov. 2021 à 11:19
Re-Bonjour KX

Je n'y suis pas encore tout à fait.
J'ai bien copié dans le répertoire start le public class HelloWorldSwing de la doc Oracle que tu m'as signalé, et compilé par javac: aucun problème, j'ai bien deux classes
HelloWorldSwing.class et HelloWorldSwing$1.class dans ce répertoire start.
Mais quand je fais ./java start.HelloWorldSwing, rien ne se passe dans la minute qui suit, comme si la machine attendait quelque chose, donc j'ai arrêté le processus par ctrl c.
J'ai tout de même remis la ligne de commande javapackager -makeall -appclass start.HelloWorldSwing -name HelloWorld et suis allé voir dans le bin\dist\bundles\HelloWorld et rien n'a changé; si je fais alors ./HelloWorld on me répond: Class start/HelloWorldSwing not found. Ce qui est bizarre, c'est qu'il y a bien une classe HelloWorldSwing.class alors qu'il faudrait une classe HelloWorldSwing tout court.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 nov. 2021 à 20:09
"quand je fais ./java start.HelloWorldSwing, rien ne se passe dans la minute qui suit"
Déjà, ce ne devrait pas être
./java
mais
java
tout court.
Ensuite, le programme n'affichera rien dans la console, c'est un programme Swing qui ouvre une petite interface graphique, en haut à gauche de ton écran, avec juste écrit "Hello World"

"J'ai tout de même remis la ligne de commande javapackager "
Et quel est le résultat du javapackager dans la ligne de commande ?

"si je fais alors ./HelloWorld on me répond: Class start/HelloWorldSwing not found."
Pareil que tout à l'heure, pourquoi faire
./HelloWorld
? Tu as un fichier .exe donc soit tu cliques dessus, soit tu tu tapes
HelloWorld.exe
en ligne de commandes.

"il y a bien une classe HelloWorldSwing.class alors qu'il faudrait une classe HelloWorldSwing tout court."
C'est normal que les fichiers soient du type .class
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
Modifié le 24 nov. 2021 à 10:55
Cela progresse, mais on n'y est pas encore.
J'ai bien exécuté la ligne de commande java start.HelloWorldSwing
et j'ai bien eu la petite fenêtre HelloWorldSwing avec marqué dedans Hello World. (je ne l'avais pas remarquée auparavant),
Quand j'ai éxécuté ensuite la ligne javapackager -makeall -appclass start.HelloWorldSwing cela m'a créé beaucoup de fichiers dans bin/dist/bundles/HellWorld,, dont l'exécutable HellWorld.exe. Donc il y a du progrès.
Mais quand, dans le répertoire bin/dist/bundles/HellWorld je tape HelloWorld.exe, on me dit que cette commande n'est pas reconnue, et si je tape ./HelloWorld.exe ou ./HelloWorld, la réponse est toujours la même: Class start.HelloWorldSwing not found. Et pourtant, dans jdk8../bin/start, j'ai bien un élément HelloWorldSwing.class . Pour voir si c'était le répertoire jdk8../bin/start qui n'était pas trouvé, j'ai essayé de lancer le HelloWolrld depuis le répertoire jdk8../bin/ par la ligne de commande: dist\bundles\HelloWorld\HelloWorld.exe et la sentence est toujours la même, que ce soit avec ou sans le .exe: Class start.HelloWorldSwing not found.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
24 nov. 2021 à 11:56
Regarde dans le /dist le fichier .jar généré, décompresse le (c'est un zip) et regarde son contenu.

Il devrait d'une part y avoir le fichier HelloWorldSwing.class dans le répertoire start et d'autre part le fichier MANIFEST.MF qui précise le main dans start.HelloWorldSwing

Remarque : quand tu parles de jdk8../bin ça veut dire que tu travailles directement dans le répertoire d'installation de ton JDK !? Il ne faut pas faire ça, tu devrais être n'importe où ailleurs dans tes dossiers mais ne pas modifier le contenu du JDK à chaque fois que tu veux compiler un programme, ça pourrait altérer tous les autres programmes Java...
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
Modifié le 24 nov. 2021 à 12:49
Dans le /dist, j'ai un seul .jar: dist.jar, qu'il me semble curieux de vouloir décompresser. Je l'ai quand-même fait, par PeaZip et cela m' a donné un HelloWorld.class (?) . Il y a aussi un dist.jnlp, que j'ai aussi essayé de dézipper, on ne sait jamais, mais cela n'a rien donné.
Il y a bien , un HelloWorldSwing.class dans le start et j'ai bien un MANIFEST.MF dans le répertoire bin/dist/META-INF, qui précise bien : Main-Class: start.HelloWorldSwing
Merci pour le conseil sur mes jdk8.. J'en tiendrai compte plus tard, à moins que tu y voies une urgence.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
24 nov. 2021 à 13:17
"qu'il me semble curieux de vouloir décompresser"
C'est la première chose que va faire Java quand il va ouvrir un jar, afin de récupérer le Manifest, ce n'est donc pas si curieux que ça...

"cela m' a donné un HelloWorld.class (?)"
Parce que tu dois avoir un HelloWorld.java qui traîne dans src (et combien d'autres choses ?) alors que tu ne devrais avoir qu'un dossier start avec un fichier HelloWorldSwing.java (et c'est tout).

"J'en tiendrai compte plus tard, à moins que tu y voies une urgence."
Le problème c'est que tu cumules plein de choses mal faites, c'est juste un HelloWorld et tu n'y arrives pas (chez moi ça fonctionne sans problème), qu'est ce que ce sera quand tu essaieras de packager ton vrai code !?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
Modifié le 25 nov. 2021 à 16:36
Bonjour.
J'ai fait ce que vous préconisez, c'est à dire d'éloigner mes programmes du fichier jdk8../bin qui contient en effet d'autres programmes que je mets parallèlement au point. J'ai créé dans le C: un répertoire intitulé application_optique_plus dans lequel j'ai créé deux nouveaux dossiers: src et start, dans lesquels j' ai copié respectivement les programmes HelloWord.java et HelloWordSwing.java, que j'ai compilés; pour le start, la ligne de commande était::
C:\application_optique_plus\start> ..\..\users\MASTER\java\jdk1.8.0_202\bin\javac HelloWorldSwing.java et de même pour le src. Les deux compilations se sont bien passées, les .class sont là.
J'ai ensuite fait:
C:\application_optique_plus> ..\users\MASTER\java\jdk1.8.0_202\bin\java start.HelloWorldSwing j'ai bien vu la petite fenêtre en haut à gauche, j'en suis sorti par la petite croix en haut à droite de cette fenêtre, puis j'ai fait:
C:\application_optique_plus> ..\users\MASTER\java\jdk1.8.0_202\bin\javapackager -makeall -appclass start.HelloWorldSwing -name HelloWorld tout s'est bien passé,j'ai bien les fichiers dist/bundles/HelloWord
mais quand je tape, dans ce dernier répertoire, la ligne de commande ./HelloWorld, la réponse est encore la même que précédemment: Class start/HelloWorldSwing not found. (la commande directe HelloWorld est refusée, et ./HelloWorld est conseillée). Et c'est pareil quand je double clique sur l'icône de l'élément HelloWorld.exe
Remarque 1 J'ai essayé de recommencer en suppimant le répertoire dist, mais cela a été refusé car d'autres programmes utilisent ce répertoire. Or je n'ai pas étudié ou fait marcher d'autres programmes depuis hier.
Remarque 2. Hier, j'ai bien obtenu une réponse du programme. mais je ne sais pas pourquoi, je n'ai rien changé, hormis déplacer mes programmes comme vous me l'avez conseillé.
Remarque 3. A vrai dire, je ne vois pas comment on peut trouver la classe start/HelloWorldSwing dans le répertoire dist/bundles/HelloWorld, le répertoire start étant dans le répertoire application_optique_plus. Mais il y a sans doute un truc que je ne connais pas!
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 26 nov. 2021 à 07:12
Bonjour,

"la ligne de commande était:: C:\application_optique_plus\start> ..\..\users\MASTER\java\jdk1.8.0_202\bin\javac"
Déjà, pour te simplifier la vie, il faudrait ajouter la valeur C:\users\MASTER\java\jdk1.8.0_202\bin dans la variable d'environnement PATH, ainisi tu auras juste à taper java, javac ou javapackager sans avoir à mettre tout le répertoire.
Voir https://java.com/fr/download/help/path_fr.html

"j'ai créé deux nouveaux dossiers: src et start, dans lesquels j' ai copié respectivement les programmes HelloWord.java et HelloWordSwing.java"
Dans tes deux projets tu devrais avoir un dossier src en haut de ton code, ensuite tu mets tes répertoires de package, en l’occurrence start, mais la racine c'est src. Donc il vaudrait mieux distinguer tes deux projets par un autre sous-dossier, sinon tu vas partager le même répertoire dist (ce qui peut être une cause de ta remarque 1)

Par exemple :
C:\workspace\HelloWorld\src\HelloWorld.java
C:\workspace\HelloWorld\src> javac HelloWorld.java
C:\workspace\HelloWorld\src> java HelloWorld
C:\workspace\HelloWorld> javapackager -makeall -appclass HelloWorld -name HelloWorld
C:\workspace\HelloWorld\dist\bundles\HelloWorld> HelloWorld.exe

C:\workspace\HelloWorldSwing\src\start\HelloWorldSwing.java
C:\workspace\HelloWorldSwing\src> javac start\HelloWorldSwing.java
C:\workspace\HelloWorldSwing\src> java start.HelloWorldSwing
C:\workspace\HelloWorldSwing> javapackager -makeall -appclass start.HelloWorldSwing -name HelloWorldSwing
C:\workspace\HelloWorldSwing\dist\bundles\HelloWorldSwing> HelloWorldSwing.exe

Remarque : il n'est pas nécessaire de faire la commande javac avant le javapackager car le makeall le fait déjà.

"J'ai essayé de recommencer en suppimant le répertoire dist, mais cela a été refusé car d'autres programmes utilisent ce répertoire."
Tu peux ouvrir le gestionnaire de tâches de Windows et fermer les applications HelloWorld ou éventuellement les processus HelloWorld.exe et java.exe
Cela peut aussi arriver si tu as ouvert un fichier du répertoire, par exemple un code avec un éditeur de texte ou un .jar avec un explorateur de zip
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
Modifié le 26 nov. 2021 à 12:27
Bonjour KX.
J'ai bien créé dans mon workspace les répertoires HelloWord/src et HelloWorldSwing/src/start dans lesquels j'ai mis et compilé respectivement HelloWord.java et HelloWordSing.java.
Les compilations se sont bien passées, et j'ai bien les éléments respectifs HelloWorld.class et HelloWorldSwing.class dans les répertoires HelloWord/src et HelloWorldSwing/src/start.
Mais quand le fais
C:\workspace\HelloWorld\src> java HelloWorld, la réponse est:
Erreur: impossible de trouver ou charger la classe principale Helloworld.
Pourtant dans HelloWorld.java, dont je te fais la copie ci-dessous, j'ai bien une ligne avec main
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World toto");
}
}

Qu'y faire?
En tous cas, merci de ta patience!
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
26 nov. 2021 à 12:43
Attention aux fautes d'orthographe, il faut donner le nom exact de la classe, avec toutes les lettres et en respectant la casse.

Ce n'est pas HelloWord (ndt: bonjour le mot), mais HelloWorld (ndt: bonjour le monde), avec un L

"impossible de trouver ou charger la classe principale Helloworld" → là c'est le W majuscule qu'il manque.
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
26 nov. 2021 à 17:26
Bonsoir KX.
J'ai suivi à la lettre tes recommandations.
Pour ce qui est du répertoire HelloWord, je suis arrivé au bout, avec notamment, pour la commande C:\workspace\HelloWorld\src> java HelloWorld
une ligne qui s'écrit en dessous de la commande: "HellWorld toto", qui vient du System.out.printl("HelloWorls toto"); de mon programme Helloworld.java.

mais quand je mets la ligne de commande
C:\workspace\HelloWorld\dist\bundles\HelloWorld> ./HelloWorld.exe
il ne se passe rien qu'un changement de ligne et une attente d'une autre commande et il n'y a pas de petite fenêtre en haut à gauche (HelloWorld.exe est refusé) . Qu'est-ce que je devrais avoir? Rien?

Pour ce qui est du répertoire HelloWordSwing, je suis arrivé au bout, tout se passe très bien:
C:\workspace\HelloWorldSwing\dist\bundles\HelloWorldSwing> HelloWorldSwing.exe
ouvre une petite fenêtre avec "HelloWord" écrit dedans, qui vient du HelloWordSwing.java.

Quelle est la suite?

Toutes mes excuses pour la faute d'orthographe que j'ai faite ce matin, ce n'est plus de mon âge..
Et merci.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
26 nov. 2021 à 18:32
Pour le HelloWorld avec juste un System.out.println c'est toi qui a voulu le faire mais en vrai je ne sais pas si un programme console est censé fonctionner.

Ce que je t'avais proposé de faire c'était de tester avec HelloWorldSwing, un programme Swing avec une interface graphique, ce qui fonctionne bien en .exe

Maintenant, la suite c'est de faire pareil avec ton vrai code, qui était également une application Swing, donc avec un répertoire "src" et une commande javapackager qui précise la bonne classe main.

Ensuite, soit tu copies tel quel le dossier dist/bundles/appName, soit tu le compresses, afin de le mettre sur un autre PC, afin de directement lancer le .exe sans avoir à installer ta version de Java sur chaque poste cible, elle est déjà dans ce dossier.

Pour aller plus loin on pourrait configurer InnoSetup ou WIX que javapackager essaye d'appeler (actuellement sans réussir) pour créer un programme d'installation.
0
benoit_28 Messages postés 43 Date d'inscription vendredi 20 mars 2020 Statut Membre Dernière intervention 11 juin 2023
Modifié le 27 nov. 2021 à 12:04
Ce coup là, je crois que je tiens le bon bout!
J'ai mis mon application optique dans C:\workspace\HelloWorldSwing\src et l' ai compilée dans ce répertoire.
Puis j'ai fait
C:\workspace\HelloWorldSwing\src> java start.HelloWorldSwing
et l'ai vu la petite fenêtre en haut à gauche.
puis C:\workspace\HelloWorldSwing javapackager -makeall -appclass start.HelloWorldSwing -name optique
et j'ai double cliqué sur l'élément dist/bundles/optique.exe et j'ai eu le grand plaisir de voir que mon programme avait démarré.
Un ENORME Merci
0