weblogic中部署SSH项目遇到的坑
总结将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
这个最好不要瞎导入,后来我才知道是因为tomcat编译JSP文件依赖于jasper,也就是说如果我们的JSP是编译之后的class文件打成jar报的形式存放在项目中就会依赖于jasper,但是导入之后在之后访问JSP也会报错,建议JSP用weblogic自己编译。
通过实践发现确实不能在weblogic中使用tomcat编译的JSP,解决办法就是将原来的JSP放到weblogic下进行编译。
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>
解决办法:修改头顶引入的uri:
<%@taglib uri = "http://java.sun.com/jsp/jstl/core" prefix="c" %>
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 |
是因为jsp是tomcat的jasper编译之后打包引起的,虽然引入了tomcat的一些包,但是weblogic在编译JSP的时候采用自己的一套编译机制,所以导致访问JSP错误,但是如果是JSP是webloic自己编译的话不会报错。
解决办法:用weblogic编译JSP。不能用tomcat编译的JSP,tomcat与weblogic使用完全不同的编译机制。
8.JSP el与ognl的问题与解决方法
在解决了上面所有的bug之后发现weblogic不能编译一些struts的#标签。
报错:语法错误,expect "{",但是遇到"#"....
在使用Webwork或Struts2标签写JSP时,经常会用到如下写法:
<ww:radio name="gender" list='#{"1":"Male", "2":"FeMale"}' />
<ww:select name="yes" list='#{"1":"YES","2":"NO"}' />
这是ognl的写法,list里的表达式将解释成成一个Map,实际上是一个LinkedHashMap。
这种写法在Tomat下部署是没有任何问题的,但部署到Weblogic 10下问题就来了,这里web.xml的version声明为3.0,编译JSP时报表达式错误。如果声明为2.3是不会报错的,因为servlet 2.3(即jsp 1.2)是不支持EL的,使用Weblogic 9同样也不会报错。据此可以推测原因为编译JSP时Weblogic? JSP编译器将OGNL的表达式误认为是EL表达式。
解决办法:
1、禁用EL。在web.xml上加上
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
2、更改web.xml的version为2.3。
3、因为大量页面用到EL,如${someValue},所以1和2基本行不通的,所以从OGNL的表达式入手,最终写成list='#@java.util.LinkedHashMap@{"1":"Male","2":"FeMale"}'?, 显式指定使用LinkedHashMap来构建Map。问题解决。(亲测有用)
9.在换掉JDK之后weblogic找不到环境变量
今天在装好weblogic之后将JDK从1.8.121换到1.8.181之后启动weblogic报错,说是找不到环境变量。解决办法:
修改%weblogic%\user_projects\domains\base_domain\bin\setDomainEnv.cmd
大概在45行左右: 将下面标红的地方换成新的JDK位置,或者直接换成%JAVA_HOME%也可以。
打印信息发现走的是最后一个else,也就是第三个标红的地方,是Oracle的java版本。(默认的JDK版本,如果想走sun的路线可以在环境变量中配置一个环境变量为JAVA_VEBDOR,值为Sun。。。没有这个环境变量的时候默认就是Oracle)
weblogic中部署SSH项目遇到的坑的更多相关文章
- weblogic中部署项目通常有三种方式
在weblogic中部署项目通常有三种方式:第一,在控制台中安装部署:第二,将部署包放在domain域中autodeploy目录下部署:第三,使用域中配置文件config.xml 进行项目的部署. 控 ...
- 在Linux系统中部署NodeJS项目
在Linux系统中部署NodeJS项目 安装NodeJS 首先进入 Node 官网,下载对应的 Node包 下载下来后是一个后缀为 xz 的压缩包,我们把这个包上传到 Linux 系统中的 /usr/ ...
- 在Tomcat中部署Web项目的操作方法,maven项目在Tomcat里登录首页报404
maven项目在Tomcat里登录首页报404, 解决:编辑conf/server.xml进行配置<Host>里的<Context>标签里的path. <Context ...
- 在Tomcat中部署web项目的三种方式
搬瓦工搭建SS教程 SSR免费节点:http://www.xiaokeli.me 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Man ...
- linux 环境下tomcat中部署jfinal项目
tomcat中部署jfinal项目 问题现象如下图 问题描述: 我在自己的windows7系统上tomcat下面跑这个项目没有任何问题吗,但是当我把项目上传到linux服务器上的tomcatwebap ...
- 记录一次使用iisnode部署node项目遇到的坑!
前言:最近因为项目原因,需要在IIS下部署node项目,在此之前,曾经部署过类似的项目,因此在这次部署还算比较顺利,只是在其中遇到了几个比较坑的问题,所以这次使用博客记录下来,如有园友遇到过类似问题, ...
- java程序监控tomcat中部署的项目的状态以及控制某些项目的启动停止
原文:http://blog.csdn.net/liuyuqin1991/article/details/49280777 步骤如下: ①:首先授权用户使获得这些权限 You can find the ...
- docker中部署django项目~~Dockfile方式和compose方式
1. 背景: 本机win10上,后端django框架代码与前端vue框架代码联调通过. 2. 目的: 在centos7系统服务器上使用docker容器部署该项目. 3. 方案一:仅使用基 ...
- 在裸机centos7系统中部署django项目的过程
概要 本文用一台安装了centos7.5系统的裸奔Linux机器(当然是虚拟机)详细讲解从无到有部署django项目的过程. 安装必要的工具 配置yum源 至于什么是yum源大家请自行百度,本人用的是 ...
随机推荐
- 【长期更新】 PHP题目
1.要求在一组数中,插入一个新数,并维护原来的排序方式不变 <?php //1.要求在一组数中,插入一个新数,并维护原来的排序方式不变 function insertArr($arr,$val) ...
- matplotlib极坐标方法详解
一.极坐标 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到 ...
- day26 单继承
继承是创建新类的一种方式,目的就为了减少代码.表达了子类是父类的关系,比如狗是动物,教授是老师一个类可以多个类继承,所有语言都是这样的一个类可以继承多个父类 ,只有python支持多继承子类可以找到父 ...
- 【比赛】NOIP2018 总结
一.考试过程 Day1: 先看了一遍题目,得到的结论是没有题是直接秒掉的,然后一道一道认真看. 看T1的时候开始并没想起来有一道原题,只是脑海中有一个印象,好像求差分和可以.然后自测了一下小样例,发现 ...
- 自学Linux Shell12.5-while、until命令
点击返回 自学Linux命令行与Shell脚本之路 12.5-while.until命令 until 循环与 while 循环在处理方式上刚好相反. while循环用于不断执行一系列命令,也用于从输入 ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
- 启用SharePoint 2013文档版本控制
cls $PSSnapin = Add-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue | Out-Nul ...
- 2018 省选 D1T2 IIIDX
题目大意: 给出k.n个数选择一种字典序最大的排列,使得对于任意的i,di>=d[i/k](下取整 下同) 分析: 很容易想到的是建树,将i的父亲设为[i/k],之后建有向边. 60分贪心: 将 ...
- 十一、java线程
目录: 一.线程的基本概念 二.线程的创建和启动 三.线程的调度和优先级 四.线程的状态控制 五.线程同步 一.线程的基本概念 线程是一个程序内部的顺序控制流 线程和进程的区别: 每个进程都由独立的代 ...
- Java主要版本平台