problème d'offending classes sous tomcat/eclipse

problème d'offending classes sous tomcat/eclipse - Java - Programmation

Marsh Posté le 01-06-2006 à 15:52:56    

Bonjour à tous,
 
Je développe une architecture Web de type client serveur avec Tomcat. Je travaille avec des servlets et voilà mon problème :  

  • J'ai développé un certains nombre de classes qui sont regoupées dans un Jar.  


  • En plus de mes classes perso sont incluses certaines bibliothèques nécessaires à la compilation d'une classe utilisant cette archive (appelons la outils.jar). Ces librairies sont (entre autres) les trois librairies de servlet nécessaires à développer des Servlets sous eclipse (servlet-api.jar, jsp-api.jar et jasper-runtime.jar), plus une autre JLink.jar qui permet de brancher un environnement Mathematica (pour les connaisseurs).


  • Sur mon serveur, j'ai une servlet principale dont le rôle est de générer automatiquement des Servlets. En fait c'est le code Java de la servlet qui est généré, tout le système de fichiers permettant d'avoir un projet tomcat opérationnel est aussi créé et les bons fichiers sont placés dans les bons répertoires (notamment outil.jar est placé dans WEB-INF/lib). Une fois tout ça effectué, je cherche à compiler le fichier java généré pour avoir le .class correspondant à la servlet utilisable par le serveur.


Dans un premier temps, j'ai essayé de faire appel au compilateur directement dans le source

Code :
  1. Runtime.exec("javac", blablabla);

mais la commande javac refuse de s'executer. J'ai essayé de pleins de façons différentes mais rien à faire.
Qu'à cela ne tienne, je contourne en créant un fichier bat qui lance la commande. Et c'est ce fichier que j'exécute dans ma classe Java. Dans une console je me suis assuré que cette commande était correcte. La voici :

Code :
  1. javac -d classes -cp lib/outils.jar src/MaServlet.java


Et là, c'est le drame : quand je teste ça sur le serveur, j'ai le message d'erreur apparemment assez classique :

Citation :

See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class


 
En farfouillant à droite à gauche, je me suis rendu compte que le problème vient des 3 fichiers jar que j'ai inclu dans mon propre jar.  La suggestion c'est généralement de les supprimer. Sauf que quand je les enlèves, ça ne compile plus au motif qu'il ne connaits plus les packages servlets, et quand je les mets ça me donne cette détestable erreur d' "offending classes".
 
Je vous soumets donc ce problème, en espérant que quelqu'un de plus perspicace que moi voit là où ça coince.
 
Merci d'avance !
 
EDIT : au fait, je suis sous windows. Je suis pas sûr d'avoir été très clair dans mon post. Donc si vous voulez plus d'éclaircissements n'hésitez pas...


Message édité par IndyGroumpf le 01-06-2006 à 16:41:12
Reply

Marsh Posté le 01-06-2006 à 15:52:56   

Reply

Marsh Posté le 02-06-2006 à 09:38:30    

Citation :

SRV.9.7.2 Web Application Classloader
The classloader that a container uses to load a servlet in a WAR must allow the
developer to load any resources contained in library JARs within the WAR
following normal J2SE semantics using getResource. It must not allow theWAR to
override J2SE or Java servlet API classes.
It is further recommended that the loader
not allow servlets in theWAR access to the web container’s implementation classes.
It is recommended also that the application class loader be implemented so
that classes and resources packaged within the WAR are loaded in preference to
classes and resources residing in container-wide library JARs.


 
Donc en effet tu ne dois pas mettre les jar de l'api servlet dans ton war mais bien évidemment tu dois les avoir dans ton projet sous Eclipse.
 
Le plus simple, c'est de ne pas les avoir dans ton lib et dans les propriétés de ton projet, au lieu de faire un "Add Jar...", fais un "Add Variable...", créé une variable TOMCAT_HOME (qui pointe vers un tomcat sur ton disque) puis "Extend..." common/lib/servlet.jar ...

Reply

Marsh Posté le 02-06-2006 à 16:07:05    

Bidem a écrit :

Citation :

 

SRV.9.7.2 Web Application Classloader
The classloader that a container uses to load a servlet in a WAR must allow the
developer to load any resources contained in library JARs within the WAR
following normal J2SE semantics using getResource. It must not allow theWAR to
override J2SE or Java servlet API classes.
It is further recommended that the loader
not allow servlets in theWAR access to the web container’s implementation classes.
It is recommended also that the application class loader be implemented so
that classes and resources packaged within the WAR are loaded in preference to
classes and resources residing in container-wide library JARs.

 

Donc en effet tu ne dois pas mettre les jar de l'api servlet dans ton war mais bien évidemment tu dois les avoir dans ton projet sous Eclipse.

 

Le plus simple, c'est de ne pas les avoir dans ton lib et dans les propriétés de ton projet, au lieu de faire un "Add Jar...", fais un "Add Variable...", créé une variable TOMCAT_HOME (qui pointe vers un tomcat sur ton disque) puis "Extend..." common/lib/servlet.jar ...


petite précision :  la compilation ne se fait pas dans l'environnement Eclipse mais sur le serveur.
Deuxième chose : qu'est ce que c'est un war exactement ? a ma connaissance je n'en manipule pas dans mon projet...

 

Merci pour la réponse en tous cas, je vais essayer de bidouiller dans la direction que tu indiques!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed