Exile on Keyboard St. - Blog sur Linux et Debian

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

dimanche 29 octobre 2017

IntelliJ IDEA: Quel formatage pour votre code Java

Beaucoup de développeurs, même expérimentés, ne prêtent pas (ou pas assez) attention au formatage du code.

Pourtant, l'utilisation d'un template de formatage de code présente les entre autres les avantages suivants:

  • le code est plus facile à lire
  • Les lignes blanches successives et inutiles sont évitées
  • En Java, le pavé des imports sera toujours cohérent entre les développeurs
  • Il permet de voir facilement les blocs, même ceux ne contenant qu'une instruction
  • Une fois un template de formatage choisi dans une équipe, les conflits à l'update sont évités et les merges facilités

Malheureusement, la plupart des projets de développement n'imposent pas un template de formatage et les développeurs se contentent trop souvent du template par défaut de leur environnement de développement. Et comme tous les développeurs n'utilisent pas le même IDE ...

Eclipse propose par exemple trois templates par défaut, qui tous utilisent des tabulations pour indenter le code ... Pire, le profile "Java Conventions" utilise à la fois des tabulations et des espaces. C'est bien dommage qu'Eclipse propose de formater le code avec des tabulations, ce que très peu de gens font encore. Parait t'il qu'historiquement, ce choix avait pour but de "sauver" de l'espace disque !!! Cette époque là est bien révolue. Enfin, pour modifier la façon de formater le code par défaut d'Eclipse, il faut dupliquer le profile avant de pouvoir le modifier, ce qui n'est pas très commode. IntelliJ IDEA n'impose pas cette restriction.

Dans ce billet, on va quand même dupliquer le profile par défaut d'IntelliJ, pour pouvoir exporter nos paramètres et aussi revenir facilement au profile par défaut.

Interdire la détection de l'indentation existante

Première chose à faire dans IntelliJ IDEA, décocher la case "Detect and use existing file indents for editing". En effet, avec cette option, si un fichier est indenté avec des tabulations, IntelliJ considèrera qu'il faut continuer d'indenter de cette façon !!!

Utiliser EditorConfig ou pas ?

EditorConfig est un format de fichier texte permettant de définir des profiles de formatage de code, via quelques propriétés. Ce format est censé être supporté par de nombreux éditeurs, ce qui est très séduisant. Malheureusement, trop peu de propriétés sont implémentées par exemple par le plugin EditorConfig pour IntelliJ, et on est donc amené à définir le reste du paramétrage dans la configuration standard de l'éditeur. J'y reviendrai peut être dans un billet séparé. Pour l'instant, on va cocher qu'on n'utilise pas EditorConfig.

Onglet 'Tabs and Indents'

On ne change rien dans cette section puisqu'IntelliJ utilise par défaut les espaces pour l'indentation et 4 de plus à chaque bloc. Ce formatage nous convient.

Onglet 'Spaces'

Dans cette section, on va cocher dans la sous-section 'Within' la case 'Array initializer braces', ce qui permet de mieux voir les paramètres dans les appels à log4j ou java.util.logging.

Onglet 'Wrapping and braces'

C'est dans cette section que l'on va modifier le plus de choses.

Concernant la position des accolades, on va adopter le style Allman, c'est à dire positionner les accolades sur la ligne suivante.

Toutes les valeurs de la sous section 'Braces placement' seront donc positionnées à 'Next line'.

Une fois qu'on a fait cela, il est logique:

  • dans 'if() statement' de cocher 'else on new line'
  • dans 'try statement' de cocher 'catch on new line' et 'finally on new line'
  • dans 'do while statement' de cocher 'while on new line'

Enfin, afin que les blocs soient bien visibles, même ceux ne contenant qu'une instruction, on va position à 'always' les propriétés 'Force braces' des sous-sections suivantes:

  • 'if() statement'
  • 'for() statement'
  • 'while() statement'
  • 'do while() statement'

Onglet 'Blank lines'

Dans la sous-section 'Keep maximum blank lines', on positionnera les 3 propriétés suivantes à 1 au lieu de 2:

  • In declarations:
  • In code:
  • Before '{':

En effet, je trouve que trop de lignes blanches n'aide pas à la lisibilité mais nous oblige à scroller.

Onglets 'JavaDoc', 'Imports' et 'Arrangement'

Je ne modifie rien pour l'instant.

Onglet 'Code generation'

Dans la section 'Final modifier' on coche les deux cases:

  • Make generated local variables final
  • Make generated parameters final

Vous pouvez utiliser le Formateur de code Java pour IDEA défini ci-dessous en le téléchargeant avec le lien précédent.

lundi 9 octobre 2017

Disposer de la complétion Bash avec Maven

L'outil de build Maven utilisé pour les projets Java a au moins un inconvénient, à savoir que par défaut aucune complétion n'est proposée dans le Terminal.

Que ce soit pour la liste des cibles ou phases ou des options comme skipTests ou maven.test.skip, dont personne ne se souvient et que tout le monde utilise ... (mai cela est une autre affaire), rien n'est proposé pour aider le développeur que vous êtes.

Heureusement, quelqu'un s'est chargé d'écrire un fichier de complétion Bash pour Maven.

Il suffit d'aller voir le dépôt maven-bash-completion et de copier le fichier de complétion dans /etc/bash.completion.d:

sudo \
    wget https://raw.github.com/dimaj/maven-bash-completion/master/bash_completion.bash \
    --output-document /etc/bash_completion.d/mvn

Vous verrez qu'ensuite, tout est plus agréable. Par exemple les cibles sont proposées quand on appuie sur TAB, exactement comme c'est le cas avec .... un Makefile !!!

jeudi 31 août 2017

Ajouter un Hook de Pre Commit dans IntelliJ IDEA

La boite de dialogue de commit d'IntelliJ IDEA propose entre autres de faire les actions suivantes avant le commit:

  • Reformatter le code
  • Optimiser les imports
  • Chercher les TODO

....

En revanche rien n'est prévu par défaut dans IntelliJ pour ajouter un script utlisateur de pre commit, qui par exemple va vérifier que vos traces ajoutées à des fins de debug ont bien été enlevées avant le commit.

Pour ajouter un Hook de pre commit, il faut installer un plugin, nommé Pre Commit Hook Plugin, qui va se charger d'éxécuter avant commit un script que vous aurez créé à la racine de votre projet et nommé pre-commit-hook.sh.

Le script sera appelé avec en paramètres les fichiers participant au commit. Il vous suffit donc dans le script de renvoyer le code retour 1 si vous avez oublié des traces de debug.

Ainsi vous éviterez les commits supplémentaires avec le message signficatif: "Oopppps: forgot to remove debug traces" !

Un exemple de script de pre commit:

#!/bin/bash

for file in "$@"; do
    grep -H -n DBG_TRACE "$file" && exit 1
done

exit 0

Le Pre Commit Hook Plugin est hébergé sur GitHub.

vendredi 13 mai 2016

Installer proprement Java sur Debian

Pour installer Java sous Linux, vous avez le choix entre les façons de faire suivantes:

  • Installer un paquet JRE ou JDK de l'OpenJDK fourni par votre système,
  • Télécharger Java sur le site d'Oracle et l'installer à la main

On s'intéressera dans ce billet à la deuxième façon de faire. Si vous utilisez Red Hat, comme Oracle fournit un paquet au format rpm, l'installation sera simple.

En revanche, lorsque vous avez une archive .tar.gz du JDK ou du JRE, c'est le cas si votre système est Debian, deux solutions s'offrent à vous:

  • décompresser la tarball dans le répertoire $HOME de votre utilisateur,
  • le faire dans /opt et avoir ainsi Java disponible pour tous les utilisateurs de votre système

Encore une fois on s'intéressera ici à la deuxième façon de faire, mais on ne se contentera pas de décompresser l'archive à la main.

En effet, il existe dans la section contrib du dépôt Debian un paquet nommé java-package avec lequel on peut fabriquer un paquet au format .deb à partir de la tarball du JRE ou du JDK.

On procédera donc comme suit:

Etape 1: Ajouter la section contrib au fichier /etc/apt/sources.list

deb http://ftp.fr.debian.org/debian/ jessie main contrib
deb-src http://ftp.fr.debian.org/debian/ jessie main contrib

Etape 2: Installer le paquet java-package

sudo apt-get install java-package

Etape 3: Créer un paquet Debian à partir du JDK ou JRE d'Oracle

fakeroot make-jpkg Téléchargements/jdk-8u73-linux-x64.tar.gz

On voit qu'on ne le fait pas en root, on aurait une erreur sinon.

Etape 4: Installer le paquet Debian qu'on vient de générer

dpkg -i oracle-java8-jdk_8u73_amd64.deb

La procédure décrite ici pour installer Java à partir d'un paquet Debian .deb que l'on génère présente les avantages suivants:

  • Java est disponible pour tous les utilisateurs
  • Etant installé via un paquet natif du système, il peut être facilement supprimé
  • On peut très facilement passer d'une version de Java à une autre avec la commande update-java-alternatives

mercredi 2 mars 2016

Passer facilement d'une version de Java à l'autre sous Linux

On a vu dans un billet précédent comment installer Java sur Linux en utilisant les JDK ou JRE fournis par le système.

Par exemple sur Debian Wheezy, j'ai la configuration suivante:

which java | xargs readlink -e
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java

Imaginons maintenant que j'ai installé l'OpenJDK en versions 6 et 7 et que je travaille sur deux projets, un en Java 7 et l'autre en Java 6. Je vais avoir besoin de passer facilement d'une version de Java à l'autre.

Le paquet java-common est là pour ça. Ce paquet fournit la commande update-java-alternatives qui permet de:

update-java-alternatives
usage: update-java-alternatives [--jre-headless] [--jre] [--plugin] [ -t|--test|-v|--verbose]
           -l|--list [<jname>]
           -s|--set <jname>
           -a|--auto
           -h|-?|--help

Lister les JDK ou JRE installés sur le système:

update-java-alternatives --list
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64
java-1.7.0-openjdk-amd64 1051 /usr/lib/jvm/java-1.7.0-openjdk-amd64

Changer le JDK ou JRE par défaut du système:

update-java-alternatives -s java-1.7.0-openjdk-amd64

SI vous regardez un petit peu, vous verrez que la commande update-java-alternatives modifie tous les liens dans /etc/alternatives pointant vers un binaire fourni par le JDK ou le JRE.

Dernière chose update-java-alternatives doit être lançée depuis le compte root.

- page 1 de 2