Maven 2 et JDK8

MAVEN2 et JDK8 sont dans un bateau

Je suis confronté en ce moment à une problématique peu commune de devoir supporter mes projets maven2 avec le JDK8. Maven est un outil de construction de projet Java, et sa dernière version est la 3.5.1. C'est un équivalent à Makefile. JDK est l'environnement Java, actuellement en version 8. La version 9 va sortir prochainement. En 2011, j'utilisais déjà Maven en version 3. C'est peu dire que mon entreprise est en retard, puisqu'en septembre 2017, elle utilise encore massivement des projets en Maven 2. (Et je trouve encore des vieux projets en maven1, quelle horreur) Il se trouve qu'en tant qu'"expert" Jenkins dans l'entreprise, je suis confronté à la problématique d'aider à maintenir ses projets. Le problème ? Jenkins pousse fortement à utiliser le JDK8 : https://jenkins.io/blog/2017/04/10/jenkins-has-upgraded-to-java-8/ Le compilateur 8 est toujours capable de construire des "binaires" en version 6. Mais la javadoc est désormais en error. Je n'ai déjà pas le temps de maintenir les projets. Vous imaginez, pour la javadoc, d'un code dont je ne connais rien. Plusieurs solutions : 1. Indiquer au compilateur que l'on ne veut pas vérifier la javadoc 2. Construire les projets avec l'ancien compilateur, malgré Jenkins. A l'aide du plugin maven toolchains"

Solution 1 :

Il faut ajouter -Xdoclint:none en paramètre du plugin. Enfin pas seulement : Le problème peut se présenter quand on appelle le maven-javadoc-plugin, mais aussi quand on appelle la phase site (qui appelle le maven-javadoc-plugin). Il faut donc gérer les deux cas. Deuxième problème : Dans le cas de jdk6 ou jdk8, cette option c'est pas reconnu et provoque une erreur de compilation. On veut que cet option ne soit lancée qu'en cas de JDK version 8 ou supérieur

voici la solution retenue, la plus compacte possible :

<profile>
    <id>doclint-java8-disable</id>
    <activation>
        <jdk>[1.8,)</jdk>
    </activation>
    <properties>
        <additionalparam>-Xdoclint:none</additionalparam>
    </properties>
</profile>

Elle n'est lancé qu'en cas de JDK8, et utilisée autant lors de la phase 'javadoc' que la phase 'site'.

Solution 2:

La solution 2 qui n'est pas celle que je recommande, car je souhaite me débarasser du JDK6/7. Jenkins lance java8 qui lance maven avec cette commande :

...

Maven lance le JDK6 à l'aide du plugin toolchains. La compilation reste compatible JDK6, donc je garde source/target 1.6.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-toolchains-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <goals>
                <goal>toolchain</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <toolchains>
            <jdk>
                <version>1.6</version>
                <vendor>sun</vendor>
            </jdk>
        </toolchains>
    </configuration>
</plugin>

Pour utiliser toolchain, vous devez avoir dans votre repertoire ~/.m2, un fichier toolchains.xml dont le contenu est :

<toolchains>
    <toolchain>
        <type>jdk</type>
        <provides>
            <version>1.6</version>
            <vendor>sun</vendor>
            <id>java6</id>
        </provides>
        <configuration>
            <jdkHome>C:\DEV\java\jdk6</jdkHome>
        </configuration>
    </toolchain>
    <toolchain>
        <type>jdk</type>
        <provides>
            <version>1.7</version>
            <vendor>sun</vendor>
            <id>java7</id>
        </provides>
        <configuration>
            <jdkHome>C:\DEV\java\jdk7</jdkHome>
        </configuration>
    </toolchain>
    <toolchain>
        <type>jdk</type>
        <provides>
            <version>1.8</version>
            <vendor>sun</vendor>
            <id>java8</id>
        </provides>
        <configuration>
            <jdkHome>C:\DEV\java\jdk8</jdkHome>
        </configuration>
    </toolchain>
</toolchains>

En espérant que ces astuces vous aideront, si vous êtes dans les mêmes conditions de fonctionnement dégradé que moi.