Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/06/2020, à 15:03

Plagioclase

[Résolu] Créer un paquet .deb Java

J'ai récemment réalisé un projet en Java dans le cadre de ma licence informatique.
Je me suis dit que ce serait une bonne idée d'essayer d'empaqueter le programme
une fois celui-ci achevé. Mais malheureusement, après deux jours d'essais infructueux
et de recherches, j'ai l'impression de ne pas être à la hauteur.

Pourtant j'aimerais réellement réussir à comprendre comment construire un paquet
debian de manière simple mais propre.

J'ai trouvé les documentations suivantes :
[doc]https://www.debian.org/doc/manuals/maint-guide/[/doc]
[doc]https://doc.ubuntu-fr.org/tutoriel/creer_un_paquet[/doc]

Si j'ai bien compris, il faut toujours commencer par faire un paquet source puis
le compiler pour obtenir le paquet binaire. Je ne sais pas s'il est possible de
directement obtenir un paquet binaire sans avoir à faire le paquet source.
J'ai surtout buté au niveau du fichier debian/rules qui semble assez complexe.
Actuellement, je n'ai pas écrit de Makefile.

Par rapport au projet, c'est un petit jeu vidéo 2D appelé "l'île interdite". Il utilise la
bibliothèque graphique Swing.

Voilà les fichiers qu'il y a dans le projet qui porte le nom forbiddenIsland :

$ ls
assets  lib.sh  makejar.sh  README.md  run.sh  src

En fait les scripts bash makejar.sh et run.sh permettent de lancer et compiler
automatiquement le projet. Mais on peut aussi le faire à la main.

Pour compiler j'utilise les commandes suivantes :

mkdir bin
javac -classpath src src/forbiddenIsland/Game.java -d bin

Pour exécuter j'utilise la commande suivante :

java -cp bin forbiddenIsland.Game

Actuellement, le projet est hébergé sur un dépôt privé GitLab. Mais si nécessaire je peux
sûrement le migrer vers GitHub.

Voilà pour les informations essentielles. Si certaines personnes ont une expérience
de la création de paquets debian, je serais très intéressé d'avoir leur expertise.

Dernière modification par Plagioclase (Le 03/06/2020, à 19:49)

Hors ligne

#2 Le 03/06/2020, à 15:42

marcus68

Re : [Résolu] Créer un paquet .deb Java

Bonjour,

Si tu as un script qui installe le jeu (un script bash avec des cp peut aussi faire l'affaire),

Tu peux faire (il faut installer checkinstall avant)

sudo checkinstall tonscript

Les fichiers qui sont déplacés seront également mis dans un paquet.

Tu pourras remplir description et dépendances du paquet.

C'est pas la manière officielle, mais c'est très simple

Hors ligne

#3 Le 03/06/2020, à 16:33

Plagioclase

Re : [Résolu] Créer un paquet .deb Java

Merci beaucoup pour cette indication, cela semble effectivement une méthode simple et efficace !
Cependant, je n'ai encore jamais écrit de script d'installation à proprement parler.

Notamment, est-ce que ce script doit de lui-même utiliser apt-get pour par exemple faire :

apt-get install default-jre

Je suppose que non puisque tu dis que je peux ensuite éditer le paquet créé par checkinstall,
mais je préfère demander.

Et de plus, dans quel(s) répertoire(s) faut-il copier les fichiers du projet ?
Je suppose que ce doit être dans le répertoire /usr/... Mais bon j'ai beaucoup
de choix alors j'hésite...

$ ls /usr
bin    include  lib32  libexec  locale  share
games  lib      lib64  local    sbin    src

Il doit sûrement y avoir des conventions à respecter.

Je pourrais par exemple placer le script de lancement du jeu que j'appellerais "forland"
dans /usr/games mais ce script ressemblerais à ça :

#!/bin/bash
java -cp bin forbiddenIsland.Game $@

Et donc là j'ai un problème c'est que j'ai le répertoire des classes compilées bin que je dois
mettre quelque part. Mais où ? Je ne vais pas le laisser en plan dans /usr/games quand même ?

Dernière modification par Plagioclase (Le 03/06/2020, à 16:34)

Hors ligne

#4 Le 03/06/2020, à 17:43

erresse

Re : [Résolu] Créer un paquet .deb Java

Bonjour,
Et si tu étudiais directement le contenu d'un paquet quelconque de la distribution ? Tu y verrais les fichiers et dossiers indispensables au fonctionnement de "apt" et "dpkg", ils ne sont pas nombreux ni très complexes en fait.
On peut bien évidemment empaqueter des binaires prêts à installer sans compilation, des scripts de différents interpréteurs (bash, python, java, etc.) ou des fichiers sources à compiler accompagnés des procédures de compilation et installation (des scripts en fait), tout est envisageable.

user@user-Ubuntu-Mate:~$ dpkg-deb --help
Syntaxe : dpkg-deb [<option> ...] <commande>

 Commandes :
   -b|--build <répertoire> [<deb>]   Construire une archive.
   -c|--contents <deb>               Lister le contenu.
   -I|--info <deb> [<cfile>...]      Afficher les informations sur
                                     la sortie standard.
   -W|--show <deb>                   Montrer des informations sur
                                     le paquet.
   -f|--field <deb> [<cfield>...]    Afficher le(s) champ(s) sur la
                                     sortie standard.
   -e|--control <deb> [<répertoire>] Extraire l'information de contrôle.
   -x|--extract <deb> <répertoire>   Extraire les fichiers.
   -X|--vextract <deb> <répertoire>  Extraire et lister les fichiers.
   -R|--raw-extract <deb> <répertoire>
                                     Extraire les informations et les fichiers de contrôle.
   --ctrl-tarfile <deb>              Produire l'archive tar de contrôle.
   --fsys-tarfile <deb>              Produire l'archive tar de système de fichiers.

  -?, --help                         Afficher ce message.
      --version                      Afficher la version.

<deb> est le nom de fichier d'une archive au format Debian.
<cfile> est le nom d'un composant fichier administratif.
<cfield> est le nom d'un champ dans le fichier « control » principal.

Options:
  -v, --verbose                    Enable verbose output.
  -D, --debug                      Enable debugging output.
      --showformat=<format>        Use alternative format for --show.
      --deb-format=<format>        Select archive format.
                                     Allowed values: 0.939000, 2.0 (default).
      --nocheck                    Suppress control file check (build bad
                                     packages).
      --root-owner-group           Forces the owner and groups to root.
      --[no-]uniform-compression   Use the compression params on all members.
  -z#                              Set the compression level when building.
  -Z<type>                         Set the compression type used when building.
                                     Allowed types: gzip, xz, zstd, none.
  -S<strategy>                     Set the compression strategy when building.
                                     Allowed values: none; extreme (xz);
                                     filtered, huffman, rle, fixed (gzip).

Syntaxe du formatage :
  Un formatage est une chaîne qui sera affichée pour chaque paquet.
  Elle peut contenir les échappements classiques \n (nouvelle ligne),
  \r (retour à la ligne) ou \\ (backslash). Des informations sur
  les paquets peuvent être incluses en utilisant la syntaxe
  ${var[;width]} (taille). Les champs seront alignés à droite, à moins que la
  taille spécifiée ne soit négative, auquel cas un alignement à gauche
  sera appliqué.

Utilisez « dpkg » pour installer et supprimer des paquets de votre
système, ou bien « apt » ou encore « aptitude » pour une gestion
conviviale des paquets.
Les paquets dépaquetés en utilisant « dpkg-deb --extract » seront
incorrectement installés !
user@user-Ubuntu-Mate:~$ 

Cette commande appliquée à un paquet simple avec l'option -R (ou --raw-extract) te permettra de recréer l'arborescence qui a permis de créer le paquet en d'y décompresser son contenu :

dpkg-deb -R <paquet> <répertoire>

Un paquet contient toujours au moins deux dossiers : DEBIAN et l'arborescence de l'application à installer (souvent usr/...).
Le dossier DEBIAN contient le protocole d'installation qui, dans des cas basiques, peut se résumer au seul fichier "control". Exemple :

Package: omnimages
Version: 0.1.1
Architecture: all
Installed-Size: 18
Depends: zenity, jhead, exiv2, imagemagick, libimage-exiftool-perl, rsync
Section: misc
Maintainer: erresse <erresse@free.fr>
Priority: optional
Description: Utilitaire de traitements divers des images
 Omnimages réunit une somme d'utilitaires pour le traitement des images
 Il permet de travailler notamment sur des photos jpeg provenant d'un APN
 exploiter les métadonnées de l'entête EXIF, créer ou modifier l'entête.
 (Opérations : renommer, classer, redimensionner, dater, etc...)

Ce fichier décrit l'application et indique au système comment installer le paquet avec quelles dépendances, etc.
L'arborescence de l'application est fonction de ce que le développeur veut installer et à quels endroits le faire. Exemple :

user@user-Ubuntu-Mate:/data/user/Developpement/paquets$ find omnimages_0.1_all
omnimages_0.1_all
omnimages_0.1_all/usr
omnimages_0.1_all/usr/bin
omnimages_0.1_all/usr/bin/omnimages
omnimages_0.1_all/usr/share
omnimages_0.1_all/usr/share/applications
omnimages_0.1_all/usr/share/applications/omnimages.desktop
omnimages_0.1_all/usr/share/icons
omnimages_0.1_all/usr/share/icons/omnimages.png
omnimages_0.1_all/usr/share/doc
omnimages_0.1_all/usr/share/doc/omnimages
omnimages_0.1_all/usr/share/doc/omnimages/copyright
omnimages_0.1_all/usr/share/doc/omnimages/README.md
omnimages_0.1_all/usr/share/doc/omnimages/changelog.gz
omnimages_0.1_all/DEBIAN
omnimages_0.1_all/DEBIAN/control
user@user-Ubuntu-Mate:/data/user/Developpement/paquets$ 

Ici, le système va copier les données dans les répertoires "/usr/..." et subordonnés, selon qu'on a du programme, de la doc, des images ou des lanceurs, etc.


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#5 Le 03/06/2020, à 18:27

marcus68

Re : [Résolu] Créer un paquet .deb Java

Plagioclase a écrit :

Merci beaucoup pour cette indication, cela semble effectivement une méthode simple et efficace !
Cependant, je n'ai encore jamais écrit de script d'installation à proprement parler.

Notamment, est-ce que ce script doit de lui-même utiliser apt-get pour par exemple faire :

apt-get install default-jre

Je suppose que non puisque tu dis que je peux ensuite éditer le paquet créé par checkinstall,
mais je préfère demander.

install default-jre ça c'est une dépendance, si il est dans la liste il sera installé avec le paquet.

Tu peux éditer au moment où tu lances checkinstall, ensuite il te crée le paquet mais après il faut refaire checkinstall si tu veux modifier quelque chose

exemple

#je crée un programme bidon
echo '#/bin/bash
echo pong' > ping

#je fais un script qui déplace mon programme dans /usr/bin et je le rends exécutable
echo '#/bin/bash
cp ping /usr/bin
chmod +x /usr/bin/ping' > installping

#je lance check install
sudo checkinstall bash installping
#je réponds aux questions

#le programme est installé et le paquet est généré
$ lesspipe marcus_20200603-1_amd64.deb (le paquet s'appelle marcus parce que j'ai pas changé le nom)
marcus_20200603-1_amd64.deb:
 new Debian package, version 2.0.
 size 808 bytes: control archive=384 bytes.
       0 octets,     0 lignes      conffiles            
     227 octets,     9 lignes      control              
 Package: marcus
 Priority: extra
 Section: checkinstall
 Installed-Size: 20
 Maintainer: root@marcus-X299-AORUS-Gaming-3
 Architecture: amd64
 Version: 20200603-1
 Provides: marcus
 Description: Package created with checkinstall 1.6.3

*** Contents:
drwxr-xr-x root/root         0 2020-06-03 18:25 ./
drwxr-xr-x root/root         0 2020-06-03 18:25 ./usr/
drwxr-xr-x root/root         0 2020-06-03 18:25 ./usr/bin/
-rwxr-xr-x root/root        21 2020-06-03 18:25 ./usr/bin/ping

Dernière modification par marcus68 (Le 03/06/2020, à 18:33)

Hors ligne

#6 Le 03/06/2020, à 19:48

Plagioclase

Re : [Résolu] Créer un paquet .deb Java

Un grand merci à vous deux marcus68 et erresse ! Grâce à vous, au bout de plusieurs essais j'ai enfin réussi à créer mon paquet .deb avec
l'outil très pratique et facile d'usage checkinstall. Je vais vous montrer du coup comment j'ai procédé.

D'abord j'ai compilé et j'ai fait le tri dans le projet en supprimant les fichiers cachés :

javac -classpath src src/forbiddenIsland/Game.java -d bin
rm -rf src .*
$ ls -a
.  ..  assets bin forland forland.desktop  forland.png  install.sh

Maintenant je vous montre le fichier install.sh :

$ cat install.sh 
#!/bin/bash

# Nom de l'application à installer
app="forland"

# Copie des fichiers binaires
mkdir /usr/lib/$app/
cp -r bin /usr/lib/$app/

# Copie des ressources
cp -r assets /usr/lib/$app/

# Copie du script exécutable
cp $app /usr/bin/

# Copie du lanceur de bureau
cp $app.desktop /usr/share/applications/

# Copie de l'icône du lanceur
cp $app.png /usr/share/icons/

Tant qu'à faire le fichier forland (le lanceur de l'application) :

$ cat forland
#!/bin/bash

java -cp /usr/lib/forland/bin forbiddenIsland.Game $@

Vous noterez le $@ pour passer les arguments à la ligne de commande.

Et également forland.desktop :

$ cat forland.desktop 
[Desktop Entry]
Version=0.0.0-1
Type=Application
Terminal=false
Name=Forland
Exec=/usr/bin/forland
Icon=/usr/share/icons/forland.png

Donc ensuite j'ai exécuté la commande :

$ sudo checkinstall bash install.sh -D

Au début, cela ne fonctionnait par car je ne précisais pas le bash devant install.sh donc merci à toi marcus68 !
Mais entre parenthèses je ne crois pas que cela soit clairement écrit dans la page de manuel.

Une fois cette commande entrée voici le répertoire obtenu :

$ ls -a
.  ..  assets  backup-060320201924-pre-forland.tgz  bin  description-pak  forland  forland_20200603-1_all.deb  forland.desktop  forland.png  install.sh

Je ne comprends pas bien à quoi sert backup-060320201924-pre-forland.tgz ?
Mais sinon la commande forland démarre bien l'application et j'ai même l'icône dans le menu des applications !

J'ai quand même une question subsidiaire : si je veux avoir un fichier de configuration du type ~/.forland qui soit créé à l'installation du paquet comment est-ce que je peux faire ?
Je crois que dans un paquet debian il y a normalement les scripts postinst et postrm pour ça. Mais avec checkinstall est-ce possible de les ajouter ?
Ou alors est-il possible d'éditer soi-même le paquet .deb créé par checkinstall ?

Je passe en [Résolu] la discussion.

Dernière modification par Plagioclase (Le 04/09/2020, à 13:26)

Hors ligne

#7 Le 03/06/2020, à 20:08

Plagioclase

Re : [Résolu] Créer un paquet .deb Java

Une autre question que je me pose c'est comment faire une page de manuel ?

Il y a sur ce forum déjà une page consacrée à cela, mais les instructions sont-elles
toujours valables (date de 2008) ?
https://forum.ubuntu-fr.org/viewtopic.php?id=259758

Hors ligne

#8 Le 03/06/2020, à 20:50

marcus68

Re : [Résolu] Créer un paquet .deb Java

J'ai pas de connaissances avancées sur le sujet. Je ne pourrais te dire pour postinst ou postrm ni pour le manuel.

Désolé sad

A ma connaissance, les pages man n'ont pas évolué depuis des années, je pense que ça peut toujours être valable

Dernière modification par marcus68 (Le 03/06/2020, à 20:52)

Hors ligne

#9 Le 04/06/2020, à 12:11

Plagioclase

Re : [Résolu] Créer un paquet .deb Java

J'ai finalement changé le répertoire dans lequel installer le paquet pour /usr/games.
Puis j'ai ajouté une page de manuel qui appartiendra à la section 6 Jeux.

$ cat install.sh 
#!/bin/bash

# Nom de l'application à installer
app="forland"

# Copie des fichiers binaires
mkdir /usr/lib/$app/
cp -r bin /usr/lib/$app/

# Copie des ressources
cp -r assets /usr/lib/$app/

# Copie du script exécutable
cp $app /usr/games/

# Copie du lanceur de bureau
cp $app.desktop /usr/share/applications/

# Copie de l'icône du lanceur
cp $app.png /usr/share/icons/

# Copie de la page de manuel
cp $app.6.gz /usr/share/man/man6

Pour compresser la page de manuel j'ai utilisé :

gzip forland.6

J'ai ensuite reconstruit le paquet avec checkinstall.
Tout s'est bien déroulé comme la dernière fois.

Maintenant comment ajouter les scripts postinst et postrm ?
J'ai trouvé ce lien : https://wiki.debian-fr.xyz/Faireunpaquet

Donc il est effectivement possible d'extraire un paquet .deb puis de l'éditer :

$ dpkg-deb -e ../forland/forland_20200604-1_all.deb
$ dpkg-deb -x ../forland/forland_20200604-1_all.deb .

Voici les scripts postinst et preinst :

$ cat postinst 
#!/bin/bash

# Nom de l'application
app="forland"

# Création du fichier de configuration personnel
mkdir ~/.$app

# Lien symbolique avec le dossier de ressources
ln -s /usr/lib/$app/assets/ ~/.$app/
$ cat postrm
#!/bin/bash

# Nom de l'application
app="forland"

# Suppression du fichier de configuration personnel
rm -rf ~/.$app

Il suffit ensuite de reconstruire le paquet en supposant que le paquet édité est placé dans le répertoire forland :

$ dpkg-deb -b forland forland_20200604-1_all.deb

Pour installer le paquet :

$ sudo apt install `pwd`forland_20200604-1_all.deb

Pour supprimer le paquet :

sudo apt remove forland

Dernière modification par Plagioclase (Le 04/09/2020, à 13:27)

Hors ligne