Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Programmation > Sorties de root > Lancer une applet Java sans serveur X

Lancer une applet Java sans serveur X

avec un framebuffer virtuel

dimanche 8 juillet 2012, par Julien H.

Écrire des programmes multimédia gérant des images, des bibliothèques de reconnaissance d’images, du réseau, une connexion MIDI ou série, etc. est devenu très facile avec des environnements tels Processing.

Mais il y a un cas particulier qui nécessite une astuce pour faire tourner un programme écrit avec Processing : il s’agit de faire tourner le programme et de bénéficier de toutes les facilités du langage (Java + bibliothèques spéciales) sans avoir d’écran connecté, ce qui veut dire pas de "serveur X" sous Linux.

Notre robot Nono étant équipé d’une carte Raspberry Pi avec un Linux Debian dessus, il était tentant de développer une applet P5 sur un PC, de l’exporter pour Linux, de la transférer sur la carte (via SFTP, voir cet article) et de l’exécuter.

On veut lancer l’application "NonoLeds" exportée depuis Processing pour Linux x86. Si vous essayez directement, vous devriez avoir ce problème :

pi@raspberrypi:~/NonoLeds$ ./NonoLeds
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at sun.awt.HeadlessToolkit.getMenuShortcutKeyMask(HeadlessToolkit.java:231)
        at processing.core.PApplet.<clinit>(PApplet.java:226)

Voici comment on y arrive :

pi@raspberrypi:~/NonoLeds$ sudo apt-get install xvfb
...
pi@raspberrypi:~/NonoLeds$ Xvfb :2 &
pi@raspberrypi:~/NonoLeds$ export DISPLAY=":2"
pi@raspberrypi:~/NonoLeds$ ./NonoLeds

Et le tour est joué. Notez bien la majuscule à Xvfb, ce n’est pas une erreur. Que s’est-il passé ?

  1. On a installé XVFB, un gestionnaire d’affichage (framebuffer) virtuel
  2. On l’a lancé sur l’écran 2 en tâche de fond (le & à la fin)
  3. On a déclaré l’écran 2 comme affichage courant
  4. On a lancé la super application NonoLeds testant l’affichage du robot Nono

Et voilà :)

Vos commentaires

  • Le 9 juillet 2012 à 23:38, par SRG En réponse à : Lancer une applet Java sans serveur X

    Mhh en général, il y a beaucoup + simple : il suffit de démarrer la JVM avec sur la ligne de commande l’option java :
    - Djava.awt.headless=true

    • Le 9 juillet 2012 à 23:51, par Julien H. En réponse à : Lancer une applet Java sans serveur X

      Merci pour cette astuce qui pourra servir dans le cas général. Il ne fonctionne pas toujours (pas sur la Raspberry Pi pour lancer un programme Processing par exemple).

    • Le 22 juillet 2012 à 10:04, par ? En réponse à : Lancer une applet Java sans serveur X

      Ca ne marche pas forcément dans tous les cas.

      Par exemple, j’ai été confronté au problème lors d’un développement (pour le boulot) ciblant un Linux serveur embarqué (application analysant des mesures faites par des capteurs et générant périodiquement des rapports PDF). La distrib (Ubuntu server minimaliste, ie avec ssh seulement) ne contenant pas X, et surtout ses fonts, la lib de génération PDF (PDFText) ainsi que celle générant les graphiques (JFreeChart) couinaient. L’option headless n’aide pas dans ce cas, car le système de gestion de fontes est invoqué en interne des libs pour faire les calculs de mise en page. Du coup, pas de fonte => pb.

      La solution dans ce cas a été d’installer un package minimal (en l’occurrence la fonte TTF DejaVu).

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document