3.e. Installation de tomcat
Ca fait maintenant presque une année que je travaille avec LCDS (LiveCycle data services). Sur windows, tout était simple. Une version lcds auto-installable était fournie avec un moteur de servlet intégré (jetty) : on installe, ça fonctionne (ou presque).
Lorsque je suis passé sous mac OSX, ça c'est légèrement compliqué. J'ai du installer apache-tomcat et le configurer en tant que moteur de servlets, et bien entendu y intégrer JOTM, un gestionnaire de transactions professionnel. Après maintes heures de recherche, j'y suis enfin arrivé, et j'ai écrit un billet à ce propos.
C'est de ce billet que je me suis inspiré pour mettre en place tomcat 6 sur mon serveur ubuntu.
Installation de Tomcat 6
J'ai tout d'abord installé tomcat6 via la commande suivante :
sudo apt-get install tomcat6 tomcat6-admin tomcat6-common tomcat6-docs tomcat6-examples tomcat6-user
Configuration de Tomcat 6
L'installation de Tomcat utilise différents répertoires :
- /etc/tomcat6 : configuration
- /var/log/tomcat6 : fichiers logs
- /var/lib/tomcat6 : le répertoire de l'application
Dans le répertoire de l'application, on trouve des liens symboliques menant dans les répertoires de configuration.
J'ai reproduit la configuration de mon billet sur LCDS + Tomcat sur mac en y faisant correspondre les fichiers et chemins.
Après avoir installé Tomcat, j'ai récupéré le répertoire de mon application sur mon mac pour le copier dans le répertoire /var/lib/tomcat6/webapps, puis j'y affecte les droits nécessaires pour qu'ils soient lu :
sudo chown -hR root:root /var/lib/tomcat6/webapps/[nom du dossier]
J'ai redémarré tomcat via la commande
sudo /etc/init.d/tomcat restart
Puis j'ai démarré mon navigateur et tappé tout d'abord l'adresse http://192.168.1.20:8080 pour voir la page racine de tomcat s'affiche. Un beau "It works" s'affiche à moi. Je tente donc d'afficher mon application via son adresse, et là, une page rouge vide... Le fond de la page est rouge, normal. Mais un message s'affiche au fond de mon navigateur : une erreur est survenue lors de l'ouverture de la page. Pour de plus amples informations, choisissez "Activité" dans le menu Fenêtres... J'affiche donc la fenêtre d'activité, et tout ce que ça me dit, c'est qu'il y a eu une "erreur interne du serveur" sur le fichier swf... Je m'en vais dans les logs d'apache. Il y a des erreurs... la première me donne un accès refusé :
26 janv. 2009 13:39:18 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Exception lors de l'allocation pour la servlet FlexSwfServlet java.security.AccessControlException: access denied (java.lang.RuntimePermission setContextClassLoader) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342) at java.security.AccessController.checkPermission(AccessController.java:553) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.Thread.setContextClassLoader(Thread.java:1368) at flex.bootstrap.BootstrapServlet.init(BootstrapServlet.java:91) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244) at java.security.AccessController.doPrivileged(Native Method)
Puis la seconde :
26 janv. 2009 13:38:46 org.apache.catalina.core.StandardContext loadOnStartup SEVERE: La servlet /flex a généré une exception "load()" java.security.AccessControlException: access denied (java.lang.RuntimePermission setContextClassLoader) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342) at java.security.AccessController.checkPermission(AccessController.java:553) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.Thread.setContextClassLoader(Thread.java:1368) at flex.bootstrap.BootstrapServlet.init(BootstrapServlet.java:91) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616)
Je vois bien que c'est une erreur de permission, mais je ne vois pas trop comment la surmonter... J'ai déjà donné les droits root sur tous les fichiers, ça semblait fonctionner la première fois que je l'avais fait (dans une ancienne installation).
J'ai fait pas mal de recherche pour tomber sur un petit billet à propos de ce message d'erreur. Il est nécessaire d'éditer le fichier /var/lib/tomcat6/conf/policy.d/04webapps.policy et d'y rajouter la ligne suivante :
grant { ... ... java.security.AllPermission; }
Je ne sais malheureusement pas exactement pour le moment jusqu'où ça peut porter à conséquence sur la sécurité du système. Mais j'ai trouvé l'info sur ce billet. On peut le faire au cas par cas, ou par packages, mais je n'ai pas réussi à trouver toutes les dépendances. ça commencerai par ça :
permission java.lang.RuntimePermission "setContextClassLoader"; permission java.lang.RuntimePermission "createClassLoader"; permission java.lang.RuntimePermission "modifyThread"; permission java.lang.RuntimePermission "shutdownHooks"; permission javax.management.MBeanServerPermission "createMBeanServer"; permission javax.management.MBeanPermission "flex.management.runtime.*", "registerMBean"; permission javax.management.MBeanPermission "flex.management.runtime.*", "unregisterMBean"; permission javax.management.MBeanTrustPermission "register"; permission java.util.PropertyPermission "trace.*", "read"; permission java.util.PropertyPermission "file.*", "read"; permission java.util.PropertyPermission "flex.*", "read"; #gestion du log : # dans log4j.properties, mettre un chemin absolu et le reporter ici permission java.io.FilePermission "/var/lib/tomcat6/webapps/flex/WEB-INF/logs/[logfile].log, "read,write,delete";
Puis après ça part un peu dans tous les sens avec les jars dépendants. A suivre au cas où ça pourrait poser un problème de sécurité...
Après avoir encore redémarré le serveur, j'ai pu exécuter mon swf et tout à fonctionné. Ouf !
Jusqu'ici tout va bien, tomcat installé.
Sources :
RIA, Flex and J2EE Appendix B