Hier, j'ai créé une simple servlet d'image et tenté de la déployer. Je reçois une erreur sur le démarrage de JBoss, puis d'autres erreurs sur l'appel de la servlet.Problème lors du déploiement de servlets dans JBoss 5.1 sur eclipse
J'ai passé environ 8 heures hier à chercher des réponses sur le Web et à essayer différents scénarios. J'ai fini par aggraver mes problèmes avec JBoss, puis je les ai corrigés, mais je n'ai jamais réussi à faire fonctionner le servlet.
Le servlet est com.controller.MyImageServlet, et ressemble à ceci:
package com.controller;
import javax.servlet.http.*;
/**
* Servlet implementation class MyImageServlet
*/
public class MyImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyImageServlet() {
super();
}
// Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* ... */
}
}
Les étiquettes que je l'ai ajouté à web.xml ressemble à ceci:
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>com.controller.MyImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/CERTIMAGE/*</url-pattern>
</servlet-mapping>
Au démarrage du serveur, c'est la seule indication dans le journal que quelque chose ne va pas:
01:59:25,328 WARN [JAXWSDeployerHookPreJSE] Cannot load servlet class: com.controller.MyImageServlet
Lorsque j'essaie le modèle d'URL (http://localhost:9980/CERTIMAGE/1), je reçois la trace de pile suivante dans le journal (et dans le navigateur):
01:59:39,640 INFO [[/]] Marking servlet ImageServlet as unavailable
01:59:39,640 ERROR [[ImageServlet]] Allocate exception for servlet ImageServlet
java.lang.ClassNotFoundException: com.controller.MyImageServlet
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.jboss.web.tomcat.service.TomcatInjectionContainer.newInstance(TomcatInjectionContainer.java:262)
at org.jboss.web.tomcat.service.TomcatInjectionContainer.newInstance(TomcatInjectionContainer.java:256)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1006)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:777)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Si je tente à nouveau le modèle d'URL, je reçois le message suivant dans le journal:
09:33:32,390 INFO [[ImageServlet]] Servlet ImageServlet is currently unavailable
J'ai vérifié que MyImageServlet.class est dans le WAR à WEB-INF/classes/com/controller. En fait, j'ai même ajouté du code à l'une de mes JSP pour tenter d'instancier le servlet et appeler la méthode doGet. Cela fonctionne réellement et renvoie les séquences de débogage correctes au journal indiquant que le constructeur de Servlet et les méthodes doGet ont été appelées.
J'ai également essayé de suivre quelques instructions pour créer/déployer une servlet HelloWorld très simple, et cela a exactement le même problème. Notez que web.xml contenait déjà une servlet mise en place par JBoss: org.jboss.web.tomcat.service.StatusServlet - ce servlet ne donne aucune erreur dans le journal. À titre d'expérience, j'ai supprimé ".web" de ce chemin et j'ai fini par obtenir exactement la même erreur que celle que j'obtiens sur ma servlet. Il semblerait donc que JBoss ne soit pas capable de localiser ma servlet en fonction du chemin spécifié. Juste pour les coups de pied, j'ai essayé toutes sortes d'autres chemins, comme simplement MyImageServlet, controller.MyImageServlet, et plus. De plus, le servlet s'appelait à l'origine ImageServlet, mais j'ai tenté de le changer en pensant qu'il y avait peut-être un conflit avec un ImageServlet existant. Dans tous les cas, le comportement est le même. Après toutes mes recherches d'hier, je dirais que cela semble être un problème avec le conteneur de servlet JBoss, et j'ai aussi appris que JBoss 5.1.0.GA devrait être livré avec un conteneur de servlet tomcat. J'ai installé JBoss sur mon PC (Windows XP) il y a moins de 2 mois (depuis jboss.org) et je l'ai utilisé à peu près tel quel. Notez que je cours sur JDK 1.6, j'ai donc utilisé la version d'installation de jboss-jdk6. Je cours sur Windows, mais je déploie également sur un serveur dédié virtuel Linux. J'ai déployé la version actuelle de mon programme, y compris la servlet sur la machine Linux, mais j'ai les mêmes erreurs. Je suis réticent à essayer simplement de réinstaller JBoss, car il est difficile de blâmer l'installation de JBoss quand j'obtiens les mêmes erreurs sur deux installations complètement différentes. Je suis un peu méfiant du conteneur de servlet Tomcat fourni, car en utilisant Eclipse, je n'ai pas pu trouver d'indication qu'il y a un tomcat dans JBoss. J'ai localisé servlet-api.jar dans le répertoire commun/lib de JBoss. C'est sur le chemin de compilation de l'éclipse.
Une remarque peut-être utile: J'avais déjà utilisé un serveur tomcat autonome pour d'autres projets utilisant la même éclipse, donc c'est peut-être une sorte de problème d'éclipse? Mais, comme je l'ai dit, je reçois les mêmes erreurs quand je me déploie sur le serveur Linux, et ce processus de déploiement implique simplement des fichiers ftp sur le serveur et ensuite les mettre dans le paquet war déployé et redémarrer JBoss.
Merci pour toute aide que vous pouvez fournir.
* "J'ai vérifié que MyImageServlet.class se trouve dans le fichier WAR sur WEB-INF/classes/com/controller/images." * Pouvez-vous lire cette déclaration? Le '/ images' est en conflit avec la déclaration du paquetage ... – BalusC
Désolé, les" images "sont des fautes de frappe. Je vais corriger cela dans l'énoncé du problème. –