Bonjour à tous, tout est dans la question...

Cela fait trois jours que mon collègue et moi-même essayons donc désespérément d'accéder à un EJB 3.0 session déployé sur un JBoss en local depuis une servlet déployé sur un Tomcat toujours en local.

La dernière piste (qui aboutit toujours au même message d'erreur) sur laquelle je viens de creuser avant de faire appel à vous lumières est la suivante :
http://devgrok.blogspot.com/2009/06/...eans-into.html
http://devgrok.blogspot.com/2009/07/...al-naming.html

Outils utilisés : jdk 1.6, eclipse galileo SR2, tomcat 6.0.26, jboss-5.1.0.GA

Le contexte :

- Un projet EJB nommé aloneEJB déployé sur JBoss.
- Un Dynamic Web Project nommé clientWeb déployé sur Tomcat.

Place au code :

- La servlet
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
 
package pack1;
 
import java.io.IOException;
 
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import stateless.TheSpecialOneRemote;
 
public class MyServlet extends HttpServlet
{
	/**
         * 
         */
	private static final long serialVersionUID = -546617990177346660L;
 
	@EJB(mappedName="ejb/TheSpecialOne")
	private TheSpecialOneRemote tso;
 
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException
	{
		doPost(req, resp);
	}
 
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException
	{
		tso.sysO();
		RequestDispatcher dispatch=req.getRequestDispatcher("succes.jsp");
        dispatch.forward(req,resp);
	}
}
- La JSP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Accès à un EJB déployé sur Jboss depuis une appli Servlet/JSP déployée Tomcat</title>
</head>
<body>
	Exécution de la servlet, cliquez <a href="MyServlet">ici</a>
</body>
</html>
- L'EJB
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
 
package stateless;
 
import javax.ejb.Remote;
import javax.ejb.Stateless;
 
/**
 * Session Bean implementation class TheSpecialOne
 */
@Stateless(mappedName="aloneEJB/TheSpecialOne")
public class TheSpecialOne implements TheSpecialOneRemote
{
    /**
     * Default constructor. 
     */
    public TheSpecialOne()
    {
        // TODO Auto-generated constructor stub
    }
 
	public void sysO()
	{
		// TODO Auto-generated method stub
		System.out.println("L'OM CHAMPION !!");
	}
}
- Le web.xml
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
 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>clientWeb</display-name>
  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>pack1.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>  
</web-app>
- Le context.xml (collé à la racine de META-INF du dynamic web project)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
<?xml version="1.0" encoding="UTF-8"?>
<Context>
2	<!-- Binds the remote context tree starting at myear to local name java:/comp/env/ejb. -->
3	<Resource name="ejb" type="javax.naming.Context" factory="org.jnp.interfaces.NamingContextFactory" URL="jnp://localhost:1099/aloneEJB"/>
4</Context>
- Le message d'erreur
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
43
44
45
46
47
 
type Rapport d'exception
 
message
 
description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
 
exception
 
javax.servlet.ServletException: Erreur à l'instantiation de la classe servlet pack1.MyServlet
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:619)
 
cause mère
 
java.lang.NoClassDefFoundError: Lstateless/TheSpecialOneRemote;
	java.lang.Class.getDeclaredFields0(Native Method)
	java.lang.Class.privateGetDeclaredFields(Class.java:2291)
	java.lang.Class.getDeclaredFields(Class.java:1743)
	org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:181)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:619)
 
cause mère
 
java.lang.ClassNotFoundException: stateless.TheSpecialOneRemote
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
	java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	java.lang.Class.getDeclaredFields0(Native Method)
	java.lang.Class.privateGetDeclaredFields(Class.java:2291)
	java.lang.Class.getDeclaredFields(Class.java:1743)
	org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:181)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:619)
Inutile de vois dire que la littérature faite à ce sujet dit tout et son contraire...

Toutes les aides seront donc les bienvenues...