Category Archives: Système

Modules Java: JRE modulaire

construire un JRE personnalisé. Ce tutoriel fait partie d’une série de trois articles qui permettront de cerner ce nouveau concept afin de l’utiliser pour plus de robustesse et maintenabilité des applications développées en Java:

  1. Modules Java: Présentation et concepts
  2. Cet article: Modules Java: JRE modulaire
  3. Modules Java: Une application exemple – Conception
  4. Modules Java: Une application exemple – Intérêts

1. Une structure plus simple et plus efficace du système.

La meilleur façon d’appréhender cette évolution de la structure est de faire une comparaison de l’existant antérieurement (version 1.8-) avec la nouvelle structure. Pour effectuer cette comparaison, on doit disposer de deux versions de Java sur le système. Une 1.8- et une 9+. Exécuter les deux commandes, observer les résultats et comparer (adapter, si besoin, les numéros de version dans les chemins cibles aux versions installées):
tree -d -I legal\|man\|docs /usr/lib/jvm/java-1.8.0-openjdk-amd64/
tree -d -I legal\|man\|docs /usr/lib/jvm/java-9-openjdk-amd64/
La commande tree n’est pas installée systématiquement sur le système utilisé. Si c’est le cas, installez la avec la commande: sudo apt install tree. Dans ces deux commandes on n’affiche que les dossiers et on exclu les dossiers: legal/, man/ et docs/ qui ne contiennent que de la documentation et sont hors d’intérêt pour cet exposé. Modules Java A gauche l’ancienne arborescence Java 1.8-, à droite la nouvelle de Java 9+. On peut constater dès le départ une nette simplification et une meilleur organisation de la structure des dossiers. Dans le détail:
  • L’apparition de deux nouveaus dossiers: conf/ destiné à contenir les fichiers de configuration et jmods/ destiné à contenir les fichiers des modules java du système, JRE et JDK.
  • Le déplacement de la partie configuration du JRE dans le dossier conf/
  • La disparition du dossier de la JRE.
  • Un seul dossier bin/ et un seul dossier lib/ destinés à acueillir respectivement les fichiers exécutables et les librairies essentiellement natives du JRE et du JDK.

2. Une utilisation plus simple de Java 9+

Si on considère que Java est installé dans le dossier JAVA_INSTALLATION/ (donc /usr/lib/jvm/java-9-openjdk-amd64/ pour un système Ubuntu/Debian):
  • Toutes les commandes exécutables du JRE et du JDK sont dans : JAVA_INSTALLATION/bin. Il suffit donc d’ajouter ce chemin à la configuration du système (chemin PATH).
  • Toutes les librairies natives du système sont dans JAVA_INSTALLATION/lib. Si besoin, il suffit d’indiquer ce chemin au système pour ce type de librairie.
  • Tous les modules (librairies Java du système) sont dans JAVA_INSTALLATION/jmods, il suffit donc d’utiliser ce chemin pour le paramètre –module-path de Java 9+.
Maintenant, vérifions les contenus de ces trois dossiers importants. Adaptez, dans cette commande,  le numéro de version de Java dans le chemin cible. Cette version pourrait être  10 ou 11 (Novembre 2018):
ls -l /usr/lib/jvm/java-9-openjdk-amd64/bin
Le résultat partiel de cette commande est:
-rwxr-xr-x 1 root root  10424 oct.   7 17:06 jaotc
-rwxr-xr-x 1 root root  10368 oct.   7 17:06 jar
-rwxr-xr-x 1 root root  10376 oct.   7 17:06 jarsigner
-rwxr-xr-x 1 root root  10344 oct.   7 17:06 java
-rwxr-xr-x 1 root root  10400 oct.   7 17:06 javac
-rwxr-xr-x 1 root root  10408 oct.   7 17:06 javadoc
-rwxr-xr-x 1 root root  10400 oct.   7 17:06 jlink
-rwxr-xr-x 1 root root  10368 oct.   7 17:06 jmod
On remarque la présence des exécutables java (JRE), javac (JDK), jlink (JDK)..
ls -l /usr/lib/jvm/java-9-openjdk-amd64/lib
Le résultat partiel de cette commande est:
-rw-r--r-- 1 root root     22976 oct.   7 17:06 libjimage.so
-rw-r--r-- 1 root root     96960 oct.   7 17:06 libnet.so
-rw-r--r-- 1 root root     72672 oct.   7 17:06 libnio.so
-rw-r--r-- 1 root root     10288 oct.   7 17:06 libprefs.so
-rw-r--r-- 1 root root      6128 oct.   7 17:06 librmi.so
On remarque la présence des librairies dynamiques partagées natives libnet.so, libnio.so, librmi.so ..
ls -l /usr/lib/jvm/java-9-openjdk-amd64/jmods
Le résultat partiel de cette commande est:
-rw-r--r-- 1 root root 19040174 oct.   7 17:06 java.base.jmod
-rw-r--r-- 1 root root   128362 oct.   7 17:06 java.logging.jmod
-rw-r--r-- 1 root root   381849 oct.   7 17:06 java.rmi.jmod
-rw-r--r-- 1 root root  6503544 oct.   7 17:06 jdk.compiler.jmod
-rw-r--r-- 1 root root   245838 oct.   7 17:06 jdk.jartool.jmod
-rw-r--r-- 1 root root   630021 oct.   7 17:06 jdk.jshell.jmod
On remarque la présence des modules java.base (JRE), java.logging (JRE), jdk.jartool (JDK)..

3. Le nouveau format de paquet JMOD

A l’exploration du contenu du dossier jmods/, on remarque que les fichiers des modules JRE et JDK ont l’extension .jmod. Il s’agit d’un nouveau format introduit par la version 9 et qui comporte des capacités plus évoluées que celles du format JAR. Le format JMOD permet d’embarquer dans un même fichier les bytecode java compilés (.class) avec des fichiers statiques, qui peuvent servir à la configuration par exemple, ainsi que du code natif. Toutefois, les fichiers ainsi créés sont destinés seulement pour des environnements de développement. L’utilitaire jmod, fichier exécutable dans le dossier bin/, permet de gérer ce type de fichier. Notament, le paramètre create permet la création de ces paquets. Pour plus de détails à propos de son fonctionnement exécuter:
jmod --help
Enfin, la connaissance de la liste des modules disponibles pour le système installé ne passe pas forcément par l’exploration du dossier jmods/. On peut afficher cette liste avec la commande:
java --list-modules

4. Création d’une image exécutable personnalisée

Le principe de fonctionnement de Java repose sur le code intermédiaire (bytecode) et l’environnement d’exécution (JRE). Ce principe permet d’exécuter le même programme, écrit une seule fois, sur des plateformes différentes. Le mécanisme prévoit que chaque plateforme, qui supporte Java, dispose de son JRE spécifique. En même temps tous les JRE doivent pouvoir exécuter le même bytecode qui résulte de la compilation des sources Java. Au fil du temps, des difficultés sont apparus. D’abord le JRE et son élément central, le fichier rt.jar, sont devenus imposants. Dans sa dernière version 1.8, rt.jar pèse 63Mo. En même temps les terminaux légers avec de faibles ressources (tablettes, smartphones, smartwatch..), commencent à prendre une place de plus en plus importante chez les utilisateurs finaux. La modularisation du JRE dans Java 9 permet, désormais, de créer une image compacte et optimisée capable d’exécuter un programme écrit en Java. Ceci consiste à créer un sous-ensemble du JRE qui ne comprend que le strict nécessaire au cas spécifique de l’application cible. La suite de cet exposé utilise l’application d’exemple créée dans le premier article qui traite des modules Java. L’application modulaire, exécutable étant créée, on procède à la génération de limage auto exécutable (JRE compris). Il faut commencer par se positionner dans le dossier où a été créée cette application. Ensuite, céez un sous dossier modules/:
mkdir modules
On crée, ensuite la version modulaire prête à l’emploi de notre application:
jmod create --class-path lib/premiermodule.jar modules/net.meddeb.premiermodule.jmod
Maintenant, on peut créer l’image auto-exécutable de l’application à l’aide de l’utilitaire jlink:
jlink --module-path /usr/lib/jvm/java-9-openjdk-amd64/jmods/:modules/ --add-modules net.meddeb.premiermodule --launcher executeHello=net.meddeb.premiermodule/net.meddeb.hellomodule.Hello --output distribution
Le paramètre –output de cette commande permet de définir le dossier où sera généré le résultat.Dans notre cas on a choisi un dossier qui s’appelle distribution/. Pour explorer le résultat de cette commande et voir ce qui a été généré:
tree -L 2 distribution/
Dans le résultat, remarquez le fichier exécutable executeHello qui est le nom donnée dans la commande de jlink : modules java L’exécution se fait par l’intermédiaire de la commande qui suit, comme s’il s’agissait d’un exécutable natif:
distribution/bin/executeHello
]]>

Installer Java 9 sur Debian Stretch

Java 9 constitue une évolution majeure de ce language de programmation / environnement d’exécution. L’évolution la plus importante apportée par cette version est sans doute l’introduction de la notion de module.  Cette introduction a nécessité un changement radical dans la structure de son environnement d’exécution (JRE) mais aussi de son kit de développement (JDK). Ce changement constitue une véritable rupture dans la façon de concevoir une application ou une librairie Java. Malgrès les précautions prises et l’effort manifeste qui a été déployé pour assurer une migration en douceur de l’énorme quantité de code déjà en utilisation de ce système, cette migration reste compliquée et sera certainement assez étalée dans le temps (Java 9 est sorti en Septembre 2017). A l’heure actuelle, du fait de la rupture entre Java 1.8- et Java 9+, migrer les systèmes serveurs à Java 9+ est un exercice risqué. En même temps il est nécessaire d’effectuer des tests en profondeur avec cette version sur les applications et les librairies existantes pour pouvoir les faire évoluer. Le système GNU/Linux Debian, destiné principalement à des machines serveurs et fidèle à son attachement à la stabilité, n’est toujours pas passé à Java 9 et ne le sera, probablement, pas de sitôt. Toutefois il y a toujours la possibilité d’installer cette version de Java pour pouvoir effectuer des tests comme indiqué. Ce tutoriel montre la manière offerte par ce système pour installer la version 9 de Java.

1. Le dépôt backports de Debian

Java 9 a été retiré du dépôt backports de Debian, certainement à cause d’incohérence constatée avec le reste du système, notament avec des interfaces graphiques. Cette méthode n’est donc  plus applicable pour Debian Stretch. Toutefois la démarche pour l’installation de paquets expérimentaux reste valable. Pour effectuer des expérimentations  Java 9+ sur Debian il convient d’utiliser plutôt la version Buster (10) de cet OS, version encore en développement à ne pas utiliser en production.
A l’installation d’un système Debian le fichier /etc/apt/sources.list référence les dépôts des paquets d’installation et de mise à jour du système. Dans ce fichier et vers la fin, on trouve:
# stretch backports
#deb http://http.debian.net/debian stretch-backports main
La première ligne est le commentaire qui donne le nom de ce dépôt. C’est la deuxième ligne qui le référence. Si elle n’a pas été modifiée, cette ligne est commentée et ce dépôt est donc désactivé. La raison pour laquelle ce dépôt est désactivé par défaut est qu’il contient des fonctionnalités en version jugée insiffisament stable ou pouvant introduire des instabilités ou encore au stade expérimental. Ce dépôt ne doit pas être utilisé pour un système en production. A l’heure actuelle (Octobre 2018) Java 9 est dans cette situation du point de vue de Debian. Cette version se trouve donc dans ce dépôt. Vérifions le, cette ligne étant commentée et Java 9 n’ayant jamais été installé sur le système utilisé, exécuter les commandes:
sudo apt update
apt-cache search openjdk | grep -E ^openjdk-[0-9]*-jdk\|jre
La réponse à la deuxième commande sera:
default-jre - Standard Java or Java compatible Runtime
default-jre-headless - Standard Java or Java compatible Runtime (headless)
openjdk-8-jdk - OpenJDK Development Kit (JDK)
openjdk-8-jdk-headless - OpenJDK Development Kit (JDK) (headless)
openjdk-8-jre - OpenJDK Java runtime, using Hotspot JIT
openjdk-8-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-8-jre-zero - Alternative JVM for OpenJDK, using Zero/Shark
openjdk-8-jre-dcevm - Alternative VM for OpenJDK 8 with enhanced class redefinition
Seule la version 1.8 est disponible.

2. Installation de la version 9

Pour pouvoir installer la version 9 de Java, il convient d’activer le dépôt backports. Cela se fait en décommentant la ligne qui le référence dans le fichier de configuration des dépôts des paquets système. On peut le faire avec un éditeur de texte ou avec la commande:
sudo sed -i '/^#.*backports /s/^#//' /etc/apt/sources.list
Après cela on refait une recherche des versions disponibles:
sudo apt update
apt-cache search openjdk | grep -E ^openjdk-[0-9]*-jdk\|jre
Le résultat sera alors:
default-jre - Standard Java or Java compatible Runtime
default-jre-headless - Standard Java or Java compatible Runtime (headless)
openjdk-8-jdk - OpenJDK Development Kit (JDK)
openjdk-8-jdk-headless - OpenJDK Development Kit (JDK) (headless)
openjdk-8-jre - OpenJDK Java runtime, using Hotspot JIT
openjdk-8-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-8-jre-zero - Alternative JVM for OpenJDK, using Zero/Shark
openjdk-8-jre-dcevm - Alternative VM for OpenJDK 8 with enhanced class redefinition
openjdk-9-jdk - OpenJDK Development Kit (JDK)
openjdk-9-jdk-headless - OpenJDK Development Kit (JDK) (headless)
openjdk-9-jre - OpenJDK Java runtime, using Hotspot JIT
openjdk-9-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
La version 9 est maintenant bien disponible à l’installation. Pour l’installer:
sudo apt install openjdk-9-jdk-headless
L’installation du JDK 9 positionne également cette version comme étant la version par défaut. Pour s’en rendre compte, pour l’environnement d’exécution (JRE) et le compilateur Java:
java -version # JRE
javac -version # compilateur
Les deux sont bien à la version 9 fraichement installée.

3. Basculer entre les versions 9 et 1.8

S’agissant d’une installation d’expérimentation, on peut bien avoir besoin de basculer entre les deux versions installées. Pour cela on utilise l’utilitaire update-java-alternatives. Exécuter:
sudo update-java-alternatives --list
La réponse sera alors:
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64
java-1.9.0-openjdk-amd64       1091       /usr/lib/jvm/java-1.9.0-openjdk-amd64
Le numéro correct de la version est 9 et non 1.9 car Java a changé la politique du numéro de version à partir de celle là. Debian, pour le moment, ne semble pas en tenir compte mais cela sera peut être rectifié à l’avenir. En tout cas cela n’empêche rien de fonctionner. L’élément important dans ce résultat est la première colonne. le nom affiché dans cette colonne sert à définir la version par défaut. Pour basculer vers la version 1.8:
sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
La valeur utilisée pour le paramètre –set est le nom affiché dans la première colonne de la liste.]]>

Mise à jour du système Ubuntu de la version 16.04 à 18.04 LTS

le système conseillé, par ce site personnel, pour une machine de bureau destinée au développement logiciel. Récemment, en fin Juillet 2018 plus exactement, la mise à jour vers la dernière version stable 18.04 (la précédente étant la 16.04) a été considérée par la communauté de cet OS comme fiable. Personnellement je constate que cette nouvelle version est suffisamment stable et fiable et je peux confirmer cette information. Cet article présente la manière de procéder pour effectuer cette mise à jour. Les pré-requis pour cette procédure sont:

  • Le système est déjà à la version 16.04 LTS.
  • La machine dispose d’une connexion à Internet.

1. Désinstaller les logiciels expérimentaux

La durée moyenne de cette procédure de mise à jour est assez longue. Avec un accès standard de type ADSL à Internet, elle ne durera pas moins d’une heure. Cette durée dépend de la quantité de logiciels installés sur le système. Il en résulte que si vous avez installé des logiciels à titre expérimental, comme un navigateur web supplémentaire par exemple, il serait avantageux de les désinstaller.

2. S’assurer de la mise à jour de la version actuelle 16.04

Pour cela, lancer successivement et dans l’ordre les commandes:
sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo apt dist-upgrade
En moyenne,  cette procédure dure quelques minutes.  On obtient un état complètement à jour de la version 16.04 du système, à la fin de cette partie.

3. Installer le gestionnaire système de mise à niveau de versions

Sur un système Ubuntu on dispose d’un gestionnaire de mise à niveau de version qui facilite cette procédure. Si ce n’est déjà fait, il convient d’installer cet utilitaire. la commande suivante permet de s’en assurer:
sudo apt install update-manager-core
Cette commande nous en informera dans le cas où l’utilitaire est déjà installé.

4. Installer la nouvelle version 18.04 LTS

A ce stade, il suffit de demande à l’utilitaire de gestion de mise à niveau de procéder à cette opération:
sudo do-release-upgrade -d
C’est la partie la plus longue de la procédure. D’abord les paquets de la nouvelle version sont téléchargés, ensuite installés. Durant cette partie de la procédure, notamment vers la fin, l’utilitaire pourra marquer des arrêts pour poser des questions auxquelles il faudra répondre. Les réponses à ces questions seront généralement de type Oui/Non mais la procédure sera bloquée pendant ce temps.

5. Redémarrer la machine

A la fin de l’installation il convient de redémarrer la machine pour accéder à la nouvelle version du système et en profiter.

6. Java sur Ubuntu 18.04

La nouvelle version d’Ubuntu installe et configure par défaut la version 11 de Java (le JRE, et oui il semblerait que l’équipe Ubuntu est hyper futuriste). Ceci pourrait entraîner des dysfonctionnements d’applications Java, même récentes. Eclipse ou JXplorer, à titre d’exemple peuvent rencontrer ce type de problème. Dans ce cas il faudra ajuster la version par défaut de Java à une version plus ancienne ou paramétrer l’application concernée pour utiliser une version plus ancienne. L’article de ce blog à ce sujet permet d’avoir plus de détails au sujet de cette configuration de Java. En réalité la version installée par défaut du JRE est la dernière version 10, même si le nom du paquet installé et sa configuration indiquent que c’est la version 11. Celle-ci ne sera effectivement disponible qu’en Septembre 2018 !]]>

Outils developpement (web)

Objectif: Ce tutoriel présente les outils developpement (web) disponibles gratuitement et à utilisation totalement libre par chacun. Il s’agit d’une présentation d’un ordinateur (de bureau) type qui pourrait servir efficacement à créer des logiciels à l’aide de ces outils.

1. Le materiel.

Un PC très récent (et donc coûteux) n’est pas forcément nécessaire pour programmer et créer des logiciels. Même un PC moyen de 2012 suffirait. En cas de besoin de puissance (IDE récent gourmand en ressources, développement nécessitant de faire tourner plusieurs processus en même temps ..), priviligier un processeur récent et la quantité de mémoire RAM (8 Go suffirait à la configuration la plus exigeante). Le reste des composants n’a pas d’importance dans la majorité des cas: ecran, carte graphique, disque dur.

2. Le système d’exploitation.

GNU/Linux Ubuntu fait parfaitement l’affaire. Il est gratuit et libre. Actuellement cet OS est simple à installer (article à venir) et configure toute sorte de materiel automatiquement. En même temps sur cet OS il y a tout ce qu’il faut comme outils gratuits et libres pour développer des applications sur toute sorte de technologies (cf. les différents articles de ce blog à titre d’exemple).

outils-developpement-webDémarrage de l’IDE Eclipse «neon» sur un système KUbuntu 16.04

3. Les outils developpement (web).

 ]]>

Installer des packages personnels sur un système Ubuntu et compatibles

Objectif: installer des packages non officiels sur un système GNU/Linux Ubuntu ou compatibles, notamment Debian pour les machines serveurs. Le caractère non officiel des packages peut être la conséquence d’existence de licence particulière qui les rend non libres au sens strict. Le JRE/JDK d’Oracle se trouve dans ce cas. Avertissement: Certains packages disponibles dans des dépôts non officiels peuvent être dans un état instable ou existent pour des raisons expérimentales. Il convient de vérifier leur statut avant de les installer. 1. Installation standard L’installation de ces packages se fait de manière standard avec l’utilitaire en ligne de commande apt-get.

sudo apt-get install oracle-java8-installer
Cette commande d’instillation du JDK Oracle version 8 ne fonctionne pas par défaut. Pour qu’elle fonctionne il faudra d’abord configurer la liste des dépôts de packages utilisables. 2. Configurer la liste des dépôts de packages Les packages du JDK d’Oracle se trouvent sur le site Launchpad: https://launchpad.net. Ils sont maintenus sur ce site par l’équipe Web Upd8http://www.webupd8.org. Il s’agit d’un site qui héberge des PPA (Personal Packages Archives). Pour ajouter cet emplacement comme source des packages installables par apt-get, il faudra utiliser la commande:
sudo add-apt-repository ppa:webupd8team/java
Cette commande veut dire ajouter à la liste des sources utilisables par apt-get le dépôt PPA de l’utilisateur webupd8team, catégorie java. Toutefois cette commande ne fonctionne pas par défaut (on peut avoir l’erreur « add-apt-repository: command not found »). Si c’est le cas, il faudra d’abord installer l’utilitaire add-apt-repository qui se trouve sur les dépôts officiels du Système Ubuntu ou compatibles. Cette installation se fait avec la commande:
sudo apt-get install software-properties-common
Après l’ajout du dépôt ppa:webupd8team/java, il convient de mettre à jour le cache de l’utilitaire apt-get:
sudo apt-get update
Après cela la commande d’installation des packages non standard invoquée en (1), fonctionnera.]]>