总结将SSH项目部署到weblogic遇到的坑。项目中是SSH,另外还用到了webservice、quartz等框架。在tomcat部署是可以的,现在总结部署到weblogic遇到的坑。
在这里说一下前提工作,前提工作将项目的日志文件输出到指定位置,便于查看自己的项目的启动情况,结合wenlogic的日志可以快速的定位到错误所在地。另外项目中读取的外部文件 要查看好,比如properties文件的读取,数据源的配置。我在适配过程中由于数据源问题导致weblogic一直发生死锁。在适配之前确保数据库服务是启动的,账号密码的配置是对的。
1.jasper缺失报的错:
weblogic.management.DeploymentException: java.lang.ClassNotFoundException: org.apache.jasper.runtime.JspSourceDependent at weblogic.application.internal.BaseDeployment.throwAppException(BaseDeployment.java:132) at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:244) at weblogic.application.internal.SingleModuleDeployment.prepare(SingleModuleDeployment.java:52) at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:158) at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:65) Truncated. see log file for complete stacktrace
解决办法:导入jasper.jar和jasper-el.jar
2.active-mq报的错
weblogic.application.ModuleException: java.lang.ClassNotFoundException: org.apache.activemq.advisory.ConsumerListener at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140) at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124) at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:233) at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:228) at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45) Truncated. see log file for complete stacktrace
项目中没有使用active-mq,可是在weblogic却报错,原因是我门使用了CXF,在这里我先将CXF模块去掉(webservice相关),切忌部可以引入activemq-all.jar。刚开始我引入activemq-all.jar,这个jar里面自带了spring模块,所以与项目的spring版本造成冲突,里面也自带了slf4j,与项目中的也冲突。所以部能引入activemq-all.jar。
去掉CXF模块:删掉CXF相关jar包,web.xml去掉CXF的入口,application去掉定义的webservice与jaxws命名空间即可。
3.hibernate报的错
ctory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [dbContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to get the default Bean Validation factory at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:671) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:401) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)
网上说是启动之后会找validation-api-1.1.0.Alpha1.jar,但是我的项目中确实存在这个包。引用网上的一段总结:
javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个bean-validation**包,但是找不到,所以beanvalitionFactory错误。 由于javax.persistence.validation.mode的属性值默认是auto,所以会出错。 在hibernate.cfg.xml里将javax.persistence.validation.mode设置为none,就可以避免出错了。 <!-- Disable the BeanValidation --> <property name="javax.persistence.validation.mode">none</property>
解决办法:在hibernate的sessionFactory中设置不检查:
<property name="javax.persistence.validation.mode">none</property>
4.项目启动成功,但是访问不到struts的action,项目中的action被打包在jar中,而且使用通配符匹配
struts.xml中设置扫描的包
<constant name="struts.convention.action.includeJars" value=".*?/struts2-action*.*?jar(!/)?" />
原因是weblogic扫描不到通配符魔术的jar包,解决办法:
第一种:将struts的action解压放在WEB-INF/classes目录下(不建议这种)
第二种:使用全名匹配struts的action所在的包,在struts.xml加下main两句话:
修改struts.xml配置(第一句是添加,第二句的struts2-action-test1是jar包的名字) <constant name="struts.convention.action.fileProtocols" value="jar,zip" /> <constant name="struts.convention.action.includeJars" value=".*struts2-action-test1.*,.*?/_wl_cls_gen.*?jar(!/)?"/>
5.不能加载struts的PrepareFilter---项目中是分别配置的struts的PrepareFilter和ExecuteFilter
<2018-9-16 下午04时57分57,731秒 CST> <Error> <HTTP> <BEA-101165> <Could not load user defined filter in web.xml: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter. java.lang.NoClassDefFoundError: org/apache/catalina/connector/ClientAbortException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetPublicMethods(Class.java:2902) at java.lang.Class.getMethods(Class.java:1615) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.getActionAnnotations(PackageBasedActionConfigBuilder.java:877)
解决办法:添加catalina.jar
6.EL表达式报错:
JSP页面如下:
<%@ page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%> <c:set var="baseurl" value="${pageContext.request.contextPath}"></c:set> <!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=UTF-8"> <title>Insert title here</title> </head> <body> ${baseurl} </body> </html>
访问报错:
forward.jsp:3:22: 静态属性必须为字符串文字, 指定表达式是不合法的。 <c:set var="baseurl" value="${pageContext.request.contextPath}"></c:set> ^---^ forward.jsp:3:22: 静态属性必须为字符串文字, 指定表达式是不合法的。 <c:set var="baseurl" value="${pageContext.request.contextPath}"></c:set>
解决办法:
7.启动终于没错了,可是在访问项目的时候又报错:
javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.apache.jasper.runtime.TagHandlerPool at weblogic.servlet.internal.StubSecurityHelper.initServletInstance(StubSecurityHelper.java:102) at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:87) at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:71) at weblogic.servlet.internal.StubLifecycleHelper.(StubLifecycleHelper.java:57) at weblogic.servlet.internal.StubLifecycleHelper.(StubLifecycleHelper.java:31) at weblogic.servlet.internal.ServletStubImpl.initStubLifecycleHelper(ServletStubImpl.java:673) at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:612) at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:414) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:304) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:631) at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:287) at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:164) at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191) at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:372)
weblogic的日志报如下错误:
java.lang.ClassCastException: weblogic.servlet.jsp.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:946) at org.apache.jsp.error_jsp._jspService(error_jsp.java:91) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:247) at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:630) at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:287) at weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:866) at weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:713) at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:158) at org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler.sendErrorResponse(DefaultDispatcherErrorHandler.java:80) at org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler.handleError(DefaultDispatcherErrorHandler.java:59) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:920) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:587) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81) at org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter.doFilter(StrutsExecuteFilter.java:93) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter.doFilter(StrutsPrepareFilter.java:91) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
最后一个错误,也被卡到这里了,
javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.apache.jasper.runtime.TagHandlerPool at weblogic.servlet.internal.StubSecurityHelper.initServletInstance(StubSecurityHelper.java:102) at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:87) at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:71) at weblogic.servlet.internal.StubLifecycleHelper.(StubLifecycleHelper.java:57) at weblogic.servlet.internal.StubLifecycleHelper.(StubLifecycleHelper.java:31) at weblogic.servlet.internal.ServletStubImpl.initStubLifecycleHelper(ServletStubImpl.java:673) at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:612) at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:414) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:304) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:631) at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:287) at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:164) at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191) at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:372) |