July 30th, 2008 @ 12:04pm | njames | Categories GNU/Linux, Java | No Comments »
J'ai expérimenté le problème intéressant des modes headless/headful en Java en codant une application de crawling de GoogleImage. Mon application crawl les pages de résultats de GoogleImage, télécharge les images proposées dans les résultats pour les stocker en local, et renvoie une page contenant des miniatures des images retrouvées. Au moment de stocker les images, j'utilise le programme convert du projet ImageMagick pour les retailler, et JIU, Java Imaging Utilities, pour obtenir leur résolution. Le projet est une servlet sur une machine distante où X est installé, mais est tomcat est lancé dans une session non X. JIU semble avoir besoin de la variable DISPLAY, car l'exception suivante est levée:
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
java.awt.GraphicsEnvironment.checkHeadless(Unknown Source)
java.awt.Window.(Unknown Source)
java.awt.Frame.(Unknown Source)
java.awt.Frame.(Unknown Source)
net.sourceforge.jiu.gui.awt.ToolkitLoader.load(ToolkitLoader.java:88)
net.sourceforge.jiu.gui.awt.ToolkitLoader.loadAsRgb24Image(ToolkitLoader.java:114)
net.trevize.Bouquinoscope.processQuery(Bouquinoscope.java:651)
net.trevize.Bouquinoscope.doPost(Bouquinoscope.java:298)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
D'après ce forum, c'est un problème rencontré aussi avec JMF, la solution est de préciser la propriété système demandant à Java d'utiliser le mode headless:
java.awt.headless=true
ou seulement pour le Toolkit AWT:
awt.toolkit=sun.awt.HeadlessToolkit
mais cela ne peut fonctionner dans mon projet car j'utilise dans mon code la classe ToolkitLoader de JIU qui, apparement, nécessite un mode headful. Du coup, pour obtenir la résolution j'utilise un java.awt.Image obtenu par ImageIO en mode headless. Pour plus d'info sur les mode headless et headful de Java, voir ce tutoriel.