Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

Tag - développement

Fil des billets - Fil des commentaires

samedi 21 décembre 2019

Gérer plusieurs versions de Java avec jEnv

Depuis la sortie de la version 9 de Java en 2017 et la nouvelle cadence de sortie des versions de Java décidée par Oracle, il devient de plus en plus difficile de ne travailler que sur une version de Java à la fois.

Se pose alors pour le développeur la question de comment passer d'une version à l'autre de Java, et si possible de façon simple.

Sur Debian, on a longtemps utilisé la commande update-java-alternatives mais elle présente plusieurs inconvénients:

  • L'utilisation d'une version de Java est globale à tout le système (liens symboliques dans /etc/alternatives)
  • Elle ne fonctionne qu'avec les JDK installés depuis les dépôts du système (utilisation des fichiers de métadonnées .jinfo)
  • Elle est spécifique à Debian (A vérifier mais il me semble que oui)

Heureusement, le projet jEnv vient à notre secours, et permet de passer très facilement d'un JDK à un autre.

1. Installation de jEnv

Pour installer jEnv, rien de plus simple:

On clone le repository Git:

git clone https://github.com/gcuisinier/jenv.git ~/.jenv

Puis on ajoute quelques lignes à la fin de notre fichier ~/.bash_profile ou ~/.bashrc

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile

Personnellement, j'ai déplacé ces lignes dans un fichier ~/.jenvrc pour les référencer ensuite dans ~/.bashrc:

if [ -f ~/.jenvrc ]; then
    . ~/.jenvrc
fi

mais ce n'est pas une obligation.

2. Configuration de jEnv

Une fois jEnv installé, on va lui indiquer quelles sont les versions de Java que l'on veux utiliser.

Au départ, aucune version de Java n'est connue de jEnv:

jenv versions

Si on ajoute un Java 9:

jenv add $HOME/jdk/jdk9/jdk-9.0.4/
openjdk64-9.0.4 added
9.0.4 added
9.0 added
9 added

Puis un Java 11:

jenv add $HOME/jdk/jdk11/jdk-11.0.2/
openjdk64-11.0.2 added
11.0.2 added
11.0 added
11 added

Les versions disponibles sont maintenant:

jenv versions
  11
  11.0
  11.0.2
  9
  9.0
  9.0.4
  openjdk64-11.0.2
  openjdk64-9.0.4

On voit que Jenv crée plusieurs tags vers le JDK ajouté.

3. Utilisation de jEnv

On a donc installé deux versions de Java, mais aucune n'est encore disponible.

Si on fait:

which java
/home/user/.jenv/shims/java

On voit que jEnv a "wrappé" la commande Java dans un script Shell.

3.1. Une version de Java globale

Définissons maintenant le Java 9 comme Java global au système:

jenv global 9

La commande précédente donne maintenant:

java -version
openjdk version "9.0.4"
OpenJDK Runtime Environment (build 9.0.4+11)
OpenJDK 64-Bit Server VM (build 9.0.4+11, mixed mode)

Et tout nouveau terminal utilisera donc Java 9.

3.2. Une version de Java locale

Si maintenant, pour un projet particulier, j'ai besoin de Java 11, je peux le définir comme la version de Java à utiliser dans un répertoire particulier:

mkdir my-project
cd my-project
jenv local 11

Et le résultat est:

java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

Si je relance la commande pour connaître les versions disponibles:

jenv versions
* 11 (set by /home/user/my-project/.java-version)
  11.0
  11.0.2
  9
  9.0
  9.0.4
  openjdk64-11.0.2
  openjdk64-9.0.4

Et si je quitte ce projet, je reviens en Java 9:

cd
java -version
openjdk version "9.0.4"
OpenJDK Runtime Environment (build 9.0.4+11)
OpenJDK 64-Bit Server VM (build 9.0.4+11, mixed mode)

Et j'ai donc:

jenv version
9 (set by /home/user/.jenv/version)

qui est la version globale:

jenv global
9

3.3. Une version de Java locale au Shell courant

On peut également changer la version de Java utilisée localement au Shell courant comme suit:

jenv shell 11

Par exemple, pour tester rapidement quelques lignes de Java grâce à au JShell de Java 9:

jenv shell 9 && jshell
|  Welcome to JShell -- Version 9.0.4
|  For an introduction type: /help intro

Comme on vient de le voir, jEnv est un outil très simple à utiliser pour passer d'une version de Java à une autre, et il ne dépend pas de la façon dont ont été installés les JDK pour être utilisé.

jEnv fait donc partie des outils que le développeur Java va adopter rapidement !

mercredi 14 août 2019

10 raccourcis clavier indispensables dans IDEA

Les développeurs Java connaissent bien les raccourcis clavier les plus usuels d'IntelliJ IDEA comme par exemple:

  • Shift Shift: Search everywhere
  • Alt + Enter: Show intentions
  • Shift + F6: Rename

ou encore:

  • Alt + Ins (ou Fn + Alt + Suppr): Generate code

Mais il y en a bien d'autres que nous utilisons quotidiennement, et ce sont ceux-la qui nous intéressent aujourd'hui.

Ctrl + Shift + A permet de chercher directement une action sans avoir à parcourir la barre d'outils ou l'ensemble des menus.

Ctrl + N, Ctrl + Alt + Shift +N permet de chercher respectivement une classe ou un symbole (variable, méthode ...).

Les deux raccourcis précédents sont des "spécialisations" du menu principal de recherche auquel on accède par Shift Shift.

Seul regret, les raccourcis utilisant 4 touches comme Ctrl + Alt + Shift + N sont un peu fatiguants à la longue !

Ctrl + F12 affiche le popup "File structure", ce qui pour une classe affiche l'ensemble des champs et méthodes. Avec Eclipse, le raccourci était Ctrl + O, mais vous n'utilisez plus Eclipse depuis longtemps !!!

Un raccourci que j'utilise souvent pour naviguer au sein de l'ensemble des fichiers actuellement modifiés, c'est Ctrl + Alt + Left / Right, et ça rend la navigation plus simple que de cliquer chaque fois sur l'onglet du fichier suivant. Ces deux raccourcis sont accessibles dans la barre d'outils via les icônes Back / Forward. On peut aussi utiliser Ctrl + Shift + Backspace.

Dans la même veine Ctrl + E et Ctrl + Shift + E affichent le "Recent files / Recent locations" popup. Ctrl + E affiche les fichiers récemment ouverts et Ctrl + Shift + E les endroits précis de ces fichiers récemment ouverts.

Ces deux racourcis sont extrèmement commodes surtout qu'en cliquant sur "Show changed only", on peut restreindre les résultats aux seules modifications faites dans le code.

Toujours dans la catégorie Navigation, F2, Shift F2 permettent de naviguer vers la prochaine / précédente erreur dans le fichier courant. Cela va infiniment plus vite que d'aller cliquer sur la petite ligne rouge dans la scrollbar ! Par contre, c'est un peu dommage qu'on ne puisse pas passer d'un fichier à l'autre - quand on a plusieurs erreurs de compilation suite à un changement de signature par exemple, ce serait bien pratique.

Pour ceux qui font du TDD, Ctrl + Shift + T permet de créer un classe de test pour la classe courante, ou de naviguer vers celle-ci si elle existe, ou encore de revenir à la classe d'implémentation depuis la classe de test. C'est alors très rapide de voir qu'une classe ne comporte pas de test unitaire ...

Curieusement, ce raccourci semble ne pas figurer dans la ReferenceCard des raccourcis d'IDEA !

Ctrl + Alt + Maj + T est un de mes préférés, il affiche le menu contextuel "Refactor this", et vous évite de mémoriser tous les racourcis correspondants: Extract variable, Extract method ...

L'avant dernier, Ctrl + Maj + Up / Down déplace le bloc de code sélectionné, c'est toujours plus propre et moins casse gueule que le Copier / Coller.

Enfin, le dernier Ctrl + Alt + Shift + S accède aux propriétés du projet, c'est à dire la fenêtre "File structure". C'est là que l'on choisit notamment le JDK utilisé.

samedi 25 mai 2019

Les versions d'OpenJDK du dépôt Debian

Dans les versions précédentes de Debian, Debian Jessie, Debian fournissait l'OpenJDK en version 6 et 7.

Maintenant qu'on est passé à Debian Stretch et que les versions 9 et 10 du JDK sont "remplacées" par les versions 11 et 12, Debian fournit les versions 8 et 11 de l'OpenJDK.

Donc, pourvu que l'on crée le fichier suivant:

root@324a074e5614:/# cat /etc/apt/sources.list.d/backports.list 
deb http://deb.debian.org/debian stretch-backports main

On dispose des paquets suivants:

root@324a074e5614:/# apt-cache search ^openjdk-
openjdk-8-dbg - Java runtime based on OpenJDK (debugging symbols)
openjdk-8-demo - Java runtime based on OpenJDK (demos and examples)
openjdk-8-doc - OpenJDK Development Kit (JDK) documentation
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-source - OpenJDK Development Kit (JDK) source files
openjdk-8-jre-dcevm - Alternative VM for OpenJDK 8 with enhanced class redefinition
openjdk-11-dbg - Java runtime based on OpenJDK (debugging symbols)
openjdk-11-demo - Java runtime based on OpenJDK (demos and examples)
openjdk-11-doc - OpenJDK Development Kit (JDK) documentation
openjdk-11-jdk - OpenJDK Development Kit (JDK)
openjdk-11-jdk-headless - OpenJDK Development Kit (JDK) (headless)
openjdk-11-jre - OpenJDK Java runtime, using Hotspot JIT
openjdk-11-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-11-jre-zero - Alternative JVM for OpenJDK, using Zero
openjdk-11-source - OpenJDK Development Kit (JDK) source files
openjdk-11-jre-dcevm - Alternative VM for OpenJDK 11 with enhanced class redefinition

à savoir l'OpenJDK en version 8 et 11, décliné en JDK et JRE et pour chaque paquet, une version normale et une headless (sans GUI) ainsi que la doc et les paquets sources.

On peut donc installer l'OpenJDK avec une commande apt-get install .. et pourvu qu'on ait installé le paquet java-package on peut passer d'un JDK à l'autre avec la commande update-java-alternatives dont on a déjà parlé.

Pour ceux qui douteraient de la version que l'on peut installer:

root@8351575db5f2:/# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b01-1~deb9u1-b01)
OpenJDK 64-Bit Server VM (build 25.212-b01, mixed mode)

C'est donc bien la dernière version du JDK 8.

root@8351575db5f2:/# java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Debian-1bpo92)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Debian-1bpo92, mixed mode, sharing)

Et il en est de même pour la version 11.

Je trouve que c'est un peu dommage de ne pas pouvoir installer le JDK 9 et 10, dans la mesure où Oracle précise bien que c'est plus compliqué de passer de Java 8 à Java 9 que de Java 9 aux versions 10, 11 et 12.

Et malheureusement, la version 12 n'est pas présente dans les dépots puisque sortie le 18 avril 2019.

On verra bien ce que ça donnera avec Debian Buster qui doit sortir prochainement, mais apparemment on n'aura "que" les versions 11 et 12. De quoi nous faire comprendre que si on est encore en Java 8 en 2019, on est à la traîne, comme si on ne le savait pas déjà !

- page 1 de 4