eponyme's blog : linux, dev & cie

Scripts JS avec Java et Rhino : mise en œuvre avec un bot IRC

Je montrais dans mon billet précédent que grâce à Rhino il est possible d'exécuter du code JavaScript depuis un programme Java, et comment il possible de se servir de ce système pour gérer des plugins. Je propose dans ce billet de mettre en œuvre ces fonctionnalités et de les appliquer à un projet simple : un robot IRC modulaire. Le principe est d'avoir un robot écrit en Java et capable de se connecter à un serveur IRC, puis de communiquer avec lui (envoi et réception de messages). Nous n'ajouterons rien à ce programme Java, aucun savoir faire pour ce robot, à une exception prêt : la possibilité de stocker des plugins qui lui permettront d'avoir de nouvelles fonctionnalités. Attention, le sujet de ce billet n'étant pas le codage d'un robot IRC (il y en a de meilleurs pour ca ^^), celui présenté ici est ultra simple, et se contente du minimum.

Pour comprendre ce programme, il faut avoir quelques notions sur Rhino/Java, des notions sur les expressions régulières, et notamment les groups qui seront bien utiles ici, et savoir en gros ce qu'est un client IRC.

Java : gérer facilement des plugins JavaScript

Dans une application, il peut être parfois intéressant d'extraire une partie de l'intelligence afin de répondre à un besoins sépcifique. Un exemple courant est une application fournie à différents clients. Elle comporte un socle commun, puis les spécificités sont développées dans des plugins afin de ne pas avoir à toucher au code de l'application pour une demande particulière. L'autre intérêt est de pouvoir charger dans une application des fonctionnalités supplémentaires, permettant de réduire le poids de l'application en retirant des fonctionnalités inutilisées. Le fait d'avoir du code externe permet aussi d'en facilité les mises à jour.

En Java, il est possible de créer des plugins de différentes façons : avec des classes externes, chargées grâce à un ClassLoader, grâce à groovy, très populaire, ou encore jython, permettant d'exécuter du code Python depuis un programme Java. Il existe de nombreuses autres solutions, comme celle d'utiliser le moteur JavaScript de la fondation Mozilla : Rhino. Sa particularité est qu'il est fourni par défaut avec Java depuis la version 6.

En ayant eu besoin pour un projet, et ayant trouvé peu d'aide en français, je propose ici quelques exemples très basiques afin de mettre en place un système de plugins JavaScript avec Java. 90% de l'aide dont j'ai eu besoin a été trouvée sur cette page de documentation. Je reprends donc ici quelques exemples, commentés, afin de comprendre le principe et d'imaginer les possibilités qu'offre Rhino. N'hésitez pas à poser des questions dans les commentaires si vous avez besoins de précisions.

Installation Java JDK sur Fedora

Depuis quelques temps, il existe des machines virtuelles java libres permettant de se passer de la machine officielle de Sun (non libérée). Fedora notemment utilise par défaut gcj, qui s'il est satisfaisant, ne répond cependant pas à toutes les utilisations. Pour le développement et certaines applications, il est encore pféférable d'utiliser la machine officielle de Sun.

Il existe aujourd'hui, via l'intermédiaire de jpackage la possibilité de se construire son propre rpm de java. D'autres préfèrent l'installation "manuelle", et même si ce n'est pas la plus recommandée (face au package), c'est encore celle que j'utilise et que je vais décrire dans ce tutoriel.

Développant en Java, j'ai décidié d'expliquer l'installation du JDK (Java Develpment Kit), comprenant le JRE (Java Runtime Environment). Nous verrons donc comment l'installer, paramètrer l'environnement pour qu'il y accède, faire en sorte qu'il soit utilisé par défaut (plutôt que gcj) comme machine virtuelle et compilateur java (javac), et enfin installerons le plugin pour firefox afin qu'il puisse utiliser notre machine pour exécuter les applets java. La version utilisée sera la 6 update 3, version la plus actuelle au moment où je rédige ce billet. J'ai réalisé cette installation sous Fedora 7.