我实验过了,是可以的。
先说说我的实验,
[1] 我使用最简单的 HelloWorld EJB 来做测试。
EJB的 coding 和配置就省去了,第一步的结果是 EJB 正常 deploy 到了 weblogic 中。
[2] 我在 tomcat 中写了一个 test.jsp
<%@page import="java.util.*"%>
<%@page import="javax.naming.*"%>
<%@page import="javax.rmi.*"%>
<%@page import="demo.*"%>
<%
Hashtable env = new Hashtable(5);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,
"t3://test-server:7001");
Context ctx = new InitialContext(env);
HelloHome helloHome = (HelloHome)PortableRemoteObject.narrow(ctx.lookup("Hello"),HelloHome.class);
Hello hello = helloHome.create();
out.println("REMOTE_RESULT:"+hello.sayHello());
%>
<p class="indent">
|
[3] 第三步,我在 $TOMCAT_HOME/webapps/ROOT/WEB-INF 下建了个 lib 目录,将生成的 EJB 的 Remote 和 Home 接口打成包,放入其中。
[4] 第四步,将 $WLS_HOME/weblogic700/server/lib/weblogic.jar copy 到 第三步的 lib 中。
[5] 正如 Robbin 所说的,Weblogic.jar 中有 servlet 相关的类,与Tomcat 的冲突,这会导致 weblogic.jar 整个 jar 都不能放入 WebClassLoader 中,最终导致 test.jsp 运行失败。因为连 javax.ejb 都找不到,当然不能运行。所以,要对 weblogic.jar 做适当的调整,我用 winrar 打开 weblogic.jar 然后去掉了 javax.servlet 这个包里的所有文件。
[6] 启动 Tomcat,一切正常,测试通过
说明:
那个 NullPointerException 错误我的理解是:因为缺少相应的 Weblogic 类造成的。
分析是这样的:
如果不定指javax.rmi.CORBA.PortableRemoteObjectClass 的实现类时,JDK会使用 com.sun.corba.se.internal.javax.rmi.PortableRemoteObject 来做为 defaul 实现。
但是因为 Weblogic 使用的协议是 t3 协议,SUN 的 JDK 没法认识与它交互的数据是什么东西,于是只好返回一个 Null Object.
我觉得 weblogic 这一点做得没有 JBoss 好,它的 weblogic.jar 太大了,不适于在第三方ServletContainer 上运行。看起来像是 BEA 没想过让别人在 Weblogic 以外调用 EJB :( .