Version imprimable Version PDF RSS
mer, 15/04/2009 - 13:51 | Yoran   Tutoriels Java
Développer avec eclipse sous Linux

L'objectif de ce tutoriel est de regrouper mes meilleurs pratiques d'installation d'un environnement de développement dédié Java sous Linux. Et ce en tentant d'être le plus large spectre possible, de l'utilisation « simple » d'Eclipse à la mise en place d'une plate-forme dédiée à un client, en passant par la création, maintenant possible avec un Java GPL, d'application Linux qui se lancent sans tracas.

Installation du JDK

Pendant longtemps la seule méthode pour installer le JDK était d'aller sur le site de SUN et de l'installer à la main. Mais lorsque que Sun c'est (enfin) décidé à placer Java sous licence GPL, la situation de la machine virtuelle au sein des distributions linux a très rapidement évoluée, jusqu'à sa mise à disposition en standard dans les dépôts, comme c'est depuis longtemps le cas pour .Net avec Mono, d'une version complète et officielle de l'environnement d'exécution Java. Avec le temps, la majorité des JDK sont ainsi devenus disponibles sous la forme de simple paquets, y compris les versions officielles de SUN.

Sur une mandriva de base les JDK suivants sont disponibles :

java-1.5.0-sun
Il s'agit de la dernière version 1.5 du JDK de SUN. A utiliser pour une compatibilité maximale avec le JDK 1.5.x
java-1.6.0-sun
Il s'agit de la dernière version 1.6 du JDK de SUN. A utiliser pour une compatibilité maximale avec le JDK 1.6.x
java-1.6.0-openjdk
La nous sommes en présences avec une version semi-libre du JDK de SUN, issue du projet OpenJDK. Semi-libre car il y a encore des éléments binaires propriétaires dans cette version.
java-1.5.0-gcj
Il s'agit d'un JDK un peu spécial basée sur GCC pour la compilation et le projet classpath pour les librairies. ClassPath est un projet GNU qui vise à développer une version totalement libre de l'ensemble du JDK. A n'utiliser que si vous cherchez à produire du code natif ou des choses très particulières.
java-1.7.0-icedtea
Issu du projet icedtea initié par RedHat, il s'agit cette fois d'un JDK totalement libre. Les éléments non-libre d'OpenJDK y ont été remplacés par leur équivalent du projet GNU CLasspath.

L'installation de chacun de ses JDK se fait de manière totalement classique selon votre distribution (urpmi, apt, etc). A ce stade se pose la question du choix d'un JDK par défaut lorsque nous en avons installés plusieurs. La réponse à ce "problème" s'appelle les alternatives.

Les alternatives sont un puissant concept, introduit par debian, permettant d'avoir sur la même machine, plusieurs version d'un même outil et de pouvoir basculer à un moment donné de l'une à l'autre de manière transparente. L'idée sous-jacente est celle d'un utilitaire update-alternatives qui va créer des liens symboliques entre une version donnée (ex. /usr/local/java/jdk1.5.0_14/bin/java) et la commande standard invoquée pour l'utiliser (ex. /usr/bin/java).

Nous pouvons ainsi lister les alternatives qui sont associées à la commande java de la manière suivante :

root#update-alternatives --list java
/usr/lib/jvm/jre-1.6.0-sun/bin/java
/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
/usr/lib/jvm/jre-1.5.0-sun/bin/java
liste des alternatives

Ceci indique que nous avons bien trois JDK d'installés. Pour connaître le JDK utilisé en ce moment, et aussi pouvoir en changer, nous procédons de la sorte :

root#update-alternatives --config java
There are 3 programs which provide `java'.
 
Selection Command
-----------------------------------------------
1 /usr/lib/jvm/jre-1.6.0-sun/bin/java
*+ 2 /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
3 /usr/lib/jvm/jre-1.5.0-sun/bin/java
 
Enter to keep the default[*], or type selection number:1
Using `/usr/lib/jvm/jre-1.6.0-sun/bin/java' to provide `java'.
root#
sélection d'un JDK

Le JDK par défaut était l'openJDK 1.6, nous utilisons maintenant le JDK de SUN.

Et effectivement, si l'on regarde ce qu'est en réalité la commande /usr/bin/java : ## readlink -f /usr/bin/java /usr/lib/jvm/java-1.6.0-sun-1.6.0.10/jre/bin/java

Les alternatives permettent non seulement de sélectionner le JDK actif, mais aussi permettent d'ajouter des JDK "non-standard" de manière trés simple.

Imaginons par exemple que vous ayez un projet nécessitant un JDK 1.4 qui n'est évidement pas dans les dépôts. Vous allez le télécharger sur le site de SUN, puis le placer dans un dossier local, par exemple /usr/local/java/jdk1.4.

Ceci fait, vous pouvez ajouter une nouvelle alternative de la manière suivante

root#update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.4/bin/java 5 \
--slave /usr/bin/javac javac /usr/local/java/jdk1.4/bin/javac

Avec l'option --install nous avons donc crée une alternative supplémentaire pour le groupe java pour la commande java du 1.4. Le dernier argument est la priorité par rapport aux autres alternatives.

L'option --slave permet quant à elle de créer des sous-alternative liées au choix de l'alternative principale. Ainsi si l'on sélectionne le java 1.4, le compilateur javac 1.4 sera lui aussi sélectionné.

Du coup, pour basculer de l'un à l'autre, c'est ultra-simple :

root#java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode)
 
 
root#update-alternatives --config java
There are 3 programs which provide `java'.
 
Selection Command
-----------------------------------------------
1 /usr/lib/jvm/jre-1.6.0-sun/bin/java
*+ 2 /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
3 /usr/lib/jvm/jre-1.5.0-sun/bin/java
4 /usr/local/java/jdk1.4/bin/java
 
Enter to keep the default[*], or type selection number:4
Using `/usr/local/java/jdk1.4/bin/java' to provide `java'.
root#javac -version
javac 1.4.0_6

Notez pour finir que le paramétrage de l'alternative par défaut de la commande Java n'a d'intérêt que pour lancer des applications java, comme eclipse lui-même. Cela n'a heureusement aucun impact sur le JDK utilisé pour développer une application. Ne paramétrez donc pas un poussif JDK 1.3 à ce niveau et ce même si votre projet le nécessite. Vous ferrez cela au sein même du projet eclipse en passant par le menu Windows/Preferences/Java/Installed JRE.

Installation d'eclipse, ANT et MAVEN2

Ces trois choses sont aujourd'hui intégrées elles aussi dans les distributions. Le seul problème est que, pour un développeur JAVA, autant le JDK ne bouge pas trop, autant nous passons notre vie à mettre à jour Eclipse, Ant, des librairies pour ANT, etc. La méthode "par paquets" est donc bien trop rigide. De plus, il suffit d'installer eclipse une fois en mode "paquet" pour se rendre compte des impacts sur les ressources au vue du nombre de dépendance que cela engendre. Une simple version adaptée à PHP (Eclipse+PDT) génère une cinquantaine d'installations annexes qui ne nous servent à rien (un serveur apache, tomcat, etc.).

A partir de maintenant donc, la « règle » est que l'ensemble des outils Java sont regroupés au même endroit, en /usr/local/java. C'est un bon usage car lorsque l'on a 10 machines de développement à installer ou à mettre à jour, il est du coup facile de dupliquer ce dossier, par rsync.

Pour éclipse, vous allez pouvoir télécharger sur le site eclipse.org la version Linux d'eclipse (attention à prendre une version 64 bits si tel est votre architecture). Les choses s'améliorant dans ce domaine, cette page vous propose plusieurs version d'eclipse. Là cela dépends de ce que vous avez à faire et vous pouvez cliquer sur le lien compare packages pour savoir à ce qu'il y a de présent dans chacune des distributions. Personnellement je vous conseille la version Eclipse IDE for Java EE Developers qui est la plus complète pour développer en Java.

Enfin pour un environnement complet, il nous faut deux indispensable, ant et maven. En effet, il est pratique d'avoir ces deux outils en ligne de commande plutôt que seulement intégrés comme plugin dans eclipse.

La version compilée de Ant est disponible sur le site Apache Ant. Quant à Maven, c'est ici que cela se passe. Dans les deux cas prendre la version tar.bz2.

Une fois vos téléchargement effectués, vous allez devoir décompresser tout ce beau monde dans /usr/local/java. Tout devrait se faire sans problèmes.

Vous devez maintenant avoir dans votre dossier quelque chose comme :

root#ls
apache-ant-1.7.1/ eclipse/ installs/ maven-2.0.7/

eclipse étant le seul qui n'ait pas son numéro de version, il faut changer cela pour s'y retrouver :

root#mv eclipse eclipse-3.4.0

Ceci fait, un des problèmes classique d'eclipse est qu'un utilisateur standard se retrouve généralement dans l'impossibilité de rajouter un nouveau plugins car il n'a pas les droit d'écriture sur le dossier /usr/local/java/eclipse. Si vous désirez changer cela, la bonne solution est de créer un groupe, par exemple du nom du produit (ici eclipse) par groupadd eclipse, et d'associer ce groupe au développeur propriétaire du compte (moi je modifie directement /etc/group pour rajouter à la fin de la ligne "eclipse", la liste des logins autorisés. La commande id login permet de voir si la modification a bien prise (le groupe "eclipse" devrait apparaître). Ensuite, je n'ai plus qu'à autoriser l'écriture à ce groupe pour tout le dossier :

root#chown :eclipse /usr/local/java/eclipse* -R
root#chmod gu+rwX /usr/local/java/eclipse* -R

Comme nous l'allons pas utiliser des alternatives pour eclipse, ant et maven, nous allons définir des liens symboliques de sorte à nous abstraire un peu des versions :

root#cd /usr/local/java
root#ln -s apache-ant-1.7.1 ant
root#ln -s eclipse-3.4.0 eclipse
root#ln -s maven-2.0.7 maven

Java nécessite un certain nombre de variables d'environnement pour fonctionner correctement, variables qui ne sont pas prise en charge par la simple installation de paquets. Pour régler cela, vous pouvez créer un simple script qui s'exécute à chaque connection. Cela se fait très simplement en ajoutant ce script dans le dossier /etc/profile.d/java.sh :

#! /bin/sh

export JAVA_HOME=$(dirname $(dirname $(readlink -f /usr/bin/java)))
export JRE_HOME=$JAVA_HOME
export JAVA_BASE=/usr/local/java
export ANT_HOME=/usr/local/java/ant
export MAVEN_HOME=/usr/local/java/maven
export ECLIPSE_HOME=/usr/local/java/eclipse

export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$JAVA_INSTAL/bin:$ANT_HOME/bin:$ECLIPSE_HOME
ajout d'un profil JAVA

Comme vous le constatez, nous utilisons ici les chemins "symboliques". Ainsi si vous changez de version d'eclipse par exemple, il suffit de changer le lien pour que cela continue de fonctionner.

Une fois le script enregistré, n'oubliez pas de faire un chmod +x /etc/profile.d/java.sh. Maintenant il ne nous reste qu'a ouvrir une console, ce qui provoquera le chargement de notre script, et de tester que tout se lance correctement.

Applications Java pour Linux

Lorsqu'il s'agit de développer une application pour Linux, il est important de se baser sur les librairies fournies avec la distribution plutôt que d'utiliser par exemple maven. Cela commence donc par ajouter et sélectionner dans votre projet le JDK iced-tea plutôt que celui de SUN.

Ensuite, si par exemple vous avez besoin des librairies DBUS, vous allez d'abord, en tant que root, l'installer :

urpmi dbus-java

Puis dans les propriétés de votre projet, dans Java Build Path/Librairies, ajouter la librairie /usr/share/java/dbus.jar. Dans la mesure où l'installation du paquet a déjà placé les librairies natives aux bons endroits, il n'y a rien d'autre à faire.

Conclusion

J'espère que ce petit tour vous aura plu et que l'utilisation de java sous linux ne sera plus un problème. Linux et Java, nous l'avons vu, fonctionne très bien ensemble, et pour peu que l'on s'y prenne bien, la souplesse de Linux s'accorde à merveille avec celle de Java.

advaya , le sam, 28/04/2007 - 18:13

Bonjour Ulhume, et tout d'abord un grand merci pour tes tutos :)))

Juste quelques remarques au passage, car je viens d'installer Eclipse 3.2.2 sous java 1.6 (et 1.4 / 1.5 pour les applis) en suivant ce tuto :

- A l'installation, les deux unzip n'ont pas marché, on doit passer par le classique "tar".
- Dans les lignes de commande du tuto, tu fais pointer le lien symbolique jdk vers le jdk-1.5, c'est donc celui qui donnera la version par défaut de java (et pas 1.4 comme tu le veux, si j'ai bien suivi ).
- Malgré avoir créé un groupe "eclipse" et avoir ajouté les bons utilisateurs, j'ai du quand même lancer eclipse en utilisateur root pour installer les plugins, sans quoi il refusait. Evidemment, pas de problèmes ensuite pour les utiliser en tant que user lambda.
- Enfin si j'ai bien compris, tmate est maintenant devenu svnkit - http://svnkit.org ?

Encore merci.

Yoran, le lun, 28/05/2007 - 09:54

Bonjour,

J'ai fait les corrections, merci. Sinon pour ton point n°2, le jdk par défaut est utilisé par eclipse pour se lancer, c'est donc bien cela. Pour les développements, les JDK sont spécifiés à l'intérieur du projet eclipse.

Pour ce qui est des utilisateurs, peux tu me donner la trace de l'erreur que cela donne ?

Enfin http://svnkit.org est une nouvelle implémentation (que j'utilise depuis 1 mois sans problèmes) mais elle ne remplace pas l'ancienne. Ce sont deux projets différents même si je commence à préférer celui là ;-)

Dab , le dim, 18/11/2007 - 12:56

Merci pour ton tuto, ca aidera peut être quelques récalcitrants à se mettre à java ... moi ??? :)
Juste quelques remarques:
-N'est-il pas plus judicieux d'installer les archives, binaires ... dans /usr/local pour ne pas avoir à toucher à l'environnement de base.
-Pour la prise en compte du groupe 'eclipse' il est nécessaire de se déloguer et donc en environnement graphique de redémarrer X. (ou encore newgroup eclipse pour le terminal en cours d'utilisation).

djib , le dim, 18/11/2007 - 14:33

J'ai peut-être raté un truc, mais pourquoi pas juste passer par apt-get (ou outil similaire), ne serait-ce au moins pour l'install de Java ?

Yoran, le dim, 18/11/2007 - 20:34

@djib Pour utiliser Java, tu n'as pas tord du tout, mais c'est avant tout une question de besoin de développement java qui me fait préférer cette approche.

Déjà, en tout cas jusqu'à récemment, les JDK n'étaient (et ne sont toujours pas, pour ma mandriva en tout cas), inclus dans les dépôts pour des raisons de licence. Ce que tu récupère en général par un urpmi ou un apt est un JDK GNU (projet ClassPath), GCJ pour la compilation et Jike pour l'exécution. Or lorsque tu bosses avec Java (au ses développement professionnel, tu dois utiliser et donc installer le JDK du client, qui peut être un vieux JDK de Sun, un JDK de BEA, etc..). Lorsque l'on passera à la version 7, les choses vont s'uniformiser un peu vu que cette version est GPL. Mais juste un peu car certaines partie du JDK de sun ne sont pas dans OpenJDK, c'est la raison d'être d'un projet comme IcedTea. Donc il sera toujours nécessaire, pour développer, d'installer son JDK à la main.

L'autre avantage de l'approche que je propose est la maîtrise exacte des versions utilisées, et la possibilité de synchroniser des équipes de développement entier sur ce principe (sans avoir à réinstaller sur chaque machine, via de simples rsync). Java étant "un os dans l'os", il n'a pas, comme php, ou python, d'autre dépendance que Java. Mon dossier /usr/local/java est donc totalement indépendant, maîtrisé et réplicable.

Enfin, lorsque l'on développe en java (je ne t'apprend peut-être rien), on a besoin d'avoir les librairies d'une version données, la JVM d'une version donnée, et ke JDK d'une version donnée, dans un environnement contrôlé pour être sur de la qualité du code produit pour le client et de la compatibilité avec son choix de plate-forme.

Bien sur, si l'on utilise Java que pour lancer des applications, que l'on utilise exclusivement le GNU ClassPath, ou que l'on utilise juste Eclipse pour faire du PHP, ton approche est de loin la meilleur. Mais pour cela, plus besoin de tutoriel ;-)

Yoran, le dim, 18/11/2007 - 20:37

@Dab bonnes remarques, merci, c'est pris en compte :)

djib , le dim, 18/11/2007 - 22:59

Mmmh, très bon point le coup de la réplication du dossier /usr/local/java.
Sinon sous Debian j'ai bien un paquet sun-java6-jdk, et c'est ce que j'utilise... mais je ne travaille pas sur de gros projets avec besoin d'uniformisation des versions.
Merci pour tes précisions.

Yoran, le dim, 18/11/2007 - 23:51

Alors là j'étais tellement étonné que je suis allé vérifié sur la deb pour voir. En en effet, tu as raison... Un paquet qui n'est pas GPL dans une debian ? Là il faut que quelqu'un m'explique.

Sinon, en effet, si tu n'as pas de contraintes sur les versions, ça le fait très bien. Pas besoin de s'enquiquiner comme je le fais ;-)

Maintenant, je dois t'avouer qu'il doit y avoir aussi là-dedans un brin de vieillisme ;-) Java étant mon outil de travail depuis... purée, 10 ans ! Ouïe, bon, j'vais aller faire à manger moi...

Dab , le lun, 19/11/2007 - 00:24

Oui sun-java6-jdk est présent sur Debian mais dans la branche testing (lenny) non-free.
Pourquoi es tu étonné Ulhume ? Le java de Sun n'est-il pas passé sous licence GPL ?

Yoran, le lun, 19/11/2007 - 01:00

A partir de la version 7 uniquement. C'est pour cela que je suis étonné.

Dab , le lun, 19/11/2007 - 01:34

ah ok, ce qui explique pourquoi c'est dans non-free ;)

bulldorack , le ven, 22/02/2008 - 16:33

Excellente chose que cette mise à jour! Le billet initial était très sympa et celui-là m'est encore plus utile... Le concept des alternatives est pile-poil ce dont j'avais besoin 8)

Yoran, le ven, 22/02/2008 - 17:53

J'avoue que ça m'a changé aussi lorsque j'ai compris comme se manipulait ces machins :-)

Publier un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement. Si vous avez un compte gravatar, l'utilisez pour afficher votre avatar.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Every instance of custom tags in the input text will be replaced with a specific tool shortcut.
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plus d'informations sur les options de formatage

Êtes-vous humain ?
Cette question est là pour déterminer si vous êtes humain ou pas...