|
数据载入中... ~用心做事,诚信做人!以德为本,兼顾各方!细心观察,联系推理! ~遵守规范->重构->可复用代码->可扩展性 *大道至简* ~时间是挤出来的,要成功,你就必须在最短的时间内采取最大量的行动!坚持到底,看到的就是胜利!再低下、再简单、再不愿意做的事情,你也要把它当成自己的事业做好!以马内利,阿们! |
|
怪事天天有,见多了就不怪了。
EJB层基本搞定,以前测试EJB也都是写一个application测试的,都没问题。 昨天把WEB层框架做好开始写代码,但怪事就来了。打开JSP就出现下面的错误 type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception javax.servlet.ServletException: javax/ejb/EJBObject org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:846) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779) org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:154) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) web.Filter.ChangeCharsetFilter.doFilter(ChangeCharsetFilter.java:58) root cause java.lang.NoClassDefFoundError: javax/ejb/EJBObject java.lang.ClassLoader.defineClass1(Native Method) java.lang.ClassLoader.defineClass(Unknown Source) java.security.SecureClassLoader.defineClass(Unknown Source) org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1626) org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:850) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1299) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1181) java.lang.ClassLoader.loadClassInternal(Unknown Source) caiwu.data.Department.identify(Department.java:418) org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:143) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) web.Filter.ChangeCharsetFilter.doFilter(ChangeCharsetFilter.java:58) note The full stack trace of the root cause is available in the Apache Tomcat/
java.lang.NoClassDefFoundError: javax/ejb/EJBObject ?????????????? 怎么会找不到EJBObject类呢?检查了一下WEB-INF\LIB目录,的确有weblogic.jar呀!?
去baidu搜索了一下,看到有篇贴说是classpath中没加dr.jar和tools.jar。 又检查了一下classpath,也加了!
打开Tomcat的日志,发现有这么一行 2005-3-6 10:44:02 org.apache.catalina.loader.WebappClassLoader validateJarFile 信息: validateJarFile(D:\jbProject\sf\web\WEB-INF\lib\weblogic.jar) - jar not loaded. See Servlet Spec 2.3, section
See Servlet Spec 2.3, section 又去baidu搜,找到这篇说得比较相似的 内容如下。 tomcat5的common/lib目录下jar包和WEB/lib下jar包冲突问题 我在学习struts过程中,启动tomcat5,基本正常,打开普通的jsp也正常,但打开与struts相关的jsp报错如下:
java.lang.NoSuchMethodError: javax.servlet.jsp.PageContext.handlePageException(Ljava/lang/Throwable;)V 查看tomcat5 console monitor 发现有些异常: 这才想起,我在tomcat/common/lib/中也放入了j2ee.jar等包,去common/lib中处不必要的包后,保证tomcat/common/lib/和WEB-INF/lib这两个目录下的jar没有重复的,问题解决。
看了一下tomcat/common/lib/,没有j2ee.jar,也没有weblogic.jar呀。 试着删除web-inf\lib目录下的weblogic.jar。 这次Tomcat日志中没有了上面那个出错,但打开jsp时还是和上面一样的错 java.lang.NoClassDefFoundError: javax/ejb/EJBObject
这时又回去查tomcat日志。注意到有这么一句 Offending class: javax/servlet/Servlet.class
联想上面提到那篇blog的内容,知道原因了(红字部分)。
用winRAR打开Tomcat5.5/common/lib/servlet-api.jar和web-inf\lib\weblogic.jar,发现里面有相同的包javax/servlet/*。
原因找出了就好办多了。
在winRAR中删除web-inf\lib\weblogic.jar中的javax/servlet/包。重启Tomcat,正常了!
但问题还没得到彻底解决,因为在JB中rebuild项目时又把win-inf\lib目录下的jar还原回去了!
真麻烦,干脆斩草除根: 在web模块的属性窗口中改设置:webModule->Properties: content \ Dependencies,把WebLogic 8.x Client改成[Execude All]。再把\bea\weblogic81\server\lib下的二个文件(weblogic.jar,webservices.jar)拷贝到Tomcat5.5/common/lib/中(这时才发现weblogic.jar有36M之巨,难怪我第次rebuild都要等N久,硬盘逛响了!)。
如果现在就去启动Tomcat,你会发现连Tomcat都罢工了! 为什么? 因为tomcat 启动后先将tomcat/common/lib目录下的jar包全部读入内存, 这时tomcat/common/lib下原来的servlet-api.jar和刚才拷贝进去的weblogic.jar中都包含有相同的包javax/servlet/,Tomcat加载时发现有重复的就退出了。
最后一步: 删除tomcat/common/lib/servlet-api.jar 或是用winRAR打开tomcat/common/libweblogic.jar删除其中的javax/servlet目录。 启动Tomcat,问题解决!
这个小问题又浪费了半天时间。 来源:http://www.qianluo.com/simple/index.php?t10047.html |