Bonjour,
Je suis en echec depuis plusieurs jours sur un problème assez velu.
Le problème se produit lorsque je déploie mon application web sur un serveur SunOne Web Server 6.2 (anciennement serveur iplanet de Netscape).
Mon application test est très simple : elle consiste en une jsp qui parse un fichier XML avec l'API DOM et affiche à l'utilisateur le nom du parser utilisé.
Ci dessous le code de la jsp :
Si le répertoire WEB-INF/lib est vide, l'exécution de la jsp se déroule normalement et je constate que le parser crimson est utilisé (en effet il est inclu dans le jdk 4.2.07 installé sur la machine).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Test parser XML</title> </head> <body> <% String documentBuilderImplClassName = null; try { javax.xml.parsers.DocumentBuilderFactory DBF=javax.xml.parsers.DocumentBuilderFactory.newInstance(); DBF.setValidating(false); javax.xml.parsers.DocumentBuilder DB = DBF.newDocumentBuilder(); documentBuilderImplClassName = DB.getClass().getName(); log("REMI : "+documentBuilderImplClassName); org.w3c.dom.Document dom = DB.parse(getServletContext().getRealPath("WEB-INF/web.xml")); } catch (Exception E) { ServletException se = new ServletException(); se.initCause(E); throw se; } %> <br/> Classe d'implementation du document builder : <%=documentBuilderImplClassName %> <br/> </body> </html>
La prochaine étape consiste à copier les fichiers suivants dans le répertoire WEB-INF/lib :
xercesImpl-2.0.2.jar
xml-apis-2.0.2.jar
Ceci correspond au parser xerces.
Maintenant la jsp se plante joyeusement avec l'exception suivante.
On voit que la jsp tente d'utiliser l'implementation Xerces (voir message de log en première ligne) mais le serveur ne parvient pas à charger la classe DOMErrorHandler.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 Context.log(): jsp: REMI : org.apache.xerces.jaxp.DocumentBuilderImpl [10/Jan/2006:17:28:01] failure (26689): for host 172.17.15.21 trying to GET /TestWEB/index.jsp, service-j2ee reports: StandardWrapperValve[jsp ]: WEB2792: Servlet.service() for servlet jsp threw exception javax.servlet.ServletException: org/w3c/dom/DOMErrorHandler at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:536) at _jsps._index_jsp._jspService(_index_jsp.java:91) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107) at javax.servlet.http.HttpServlet.service(HttpServlet.java:908) at com.iplanet.ias.web.jsp.JspServlet$JspServletWrapper.service(JspServlet.java:675) at com.iplanet.ias.web.jsp.JspServlet.serviceJspFile(JspServlet.java:447) at com.iplanet.ias.web.jsp.JspServlet.service(JspServlet.java:363) at javax.servlet.http.HttpServlet.service(HttpServlet.java:908) at org.apache.catalina.core.StandardWrapperValve.invokeServletService(StandardWrapperValve.java:771) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:322) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:212) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:209) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509) at com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.java:161) at com.iplanet.ias.web.WebContainer.service(WebContainer.java:578) ----- Root Cause ----- java.lang.NoClassDefFoundError: org/w3c/dom/DOMErrorHandler at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:539) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1717) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:983) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1431) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1301) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) at org.apache.xerces.dom.CoreDocumentImpl.<init>(CoreDocumentImpl.java:173) at org.apache.xerces.dom.DocumentImpl.<init>(DocumentImpl.java:173) at org.apache.xerces.dom.DeferredDocumentImpl.<init>(DeferredDocumentImpl.java:194) at org.apache.xerces.dom.DeferredDocumentImpl.<init>(DeferredDocumentImpl.java:189) at org.apache.xerces.parsers.AbstractDOMParser.startDocument(AbstractDOMParser.java:712) at org.apache.xerces.impl.XMLNamespaceBinder.startDocument(XMLNamespaceBinder.java:444) at org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(XMLDTDValidator.java:644) at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(XMLDocumentScannerImpl.java:431) at org.apache.xerces.impl.XMLEntityManager.startEntity(XMLEntityManager.java:878) at org.apache.xerces.impl.XMLEntityManager.startDocumentEntity(XMLEntityManager.java:741) at org.apache.xerces.impl.XMLDocumentScannerImpl.setInputSource(XMLDocumentScannerImpl.java:260)
Pourtant cette classe se trouve dans l'archive xercesImpl-2.0.2.jar
Alors, étant donné que le classloader trouve bien la classe org.apache.xerces.jaxp.DocumentBuilderImpl, je ne comprend pas pourqoui il ne trouve pas l'autre, sachant qu'elles se trouvent toutes les deux dans le même jar.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 sun26:> jar tvf xercesImpl-2.0.2.jar | grep DOMErrorHandler 2754 Fri Jun 21 10:50:56 CEST 2002 org/apache/xerces/util/DOMErrorHandlerWrapper.class 173 Fri Jun 21 10:50:56 CEST 2002 org/w3c/dom/DOMErrorHandler.class sun26:>
Je précise que sous Tomcat, je ne rencontre absolument pas ce problème.
Partager