tomcat程序部署到weblogic遇到的问题总结:

环境描述:

      maven3 + eclipse-jee-kepler-R-win32-x86_64.zip + weblogic 10.3.4 + eclipse的weblogic插件

1、ClassNotFoundException: org.hibernate.hql.ast.HqlToken;

      原因:web应用中的antrl包和weblogic中的包出现冲突;

      解决办法:

           在weblogic.xml的weblogic-web-app下添加配置,以保证使用war包lib下的jar文件:

            <container-descriptor>

                     <prefer-web-inf-classes>true</prefer-web-inf-classes>

           </container-descriptor>

           但是,这个时候会出现后边的问题,请看第2、3个问题:

2、java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parser.DocumentBuilderFactroy

      原因:war包中的xml-apis-xx.jar和weblogic中的xml解析包出现冲突;

      解决办法:从项目中删掉这个jar包,如果是在maven情况下,可以采用maven的方式去掉,比如这个包是引入dom4j时传递引入的包,则可致在依赖中添加exclusion标签去掉

                          对该jar包的依赖;

3、java.lang.ClassNotFoundException: org.apache.velocity.app.VelocityEngine

      原因:不清楚,估计是weblogic采用模板技术来完成一些模板文件的解析,具体以后再查;

      解决办法:添加velocity和veloticy-tool两个jar包,如果是maven管理项目,则采用maven的pom.xml中引入这俩组件;

4、java.lang.NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval()Z

       原因:weblogic的javax.persistence_xx.jar包相对陈旧

       解决办法:

                  修改应用lib下的hibernate-jpa-2.0-api-xx.jar和上边weblogic中的javax.persistence_xx.jar名字一样,然后替换%weblogic_home%/middleware/modules下的javax.persistence_xx.jar包,这个办法实在是无奈之间,希望以后有更好的办法,比如修改配置可以改变类加载器的加载顺序和路径等来让其加载lib下hibernate提供的jar包;


      至此,他娘的总算起来了,不过由于servlet规范的不同(weblogic说tomcat不是真正的遵守规范,扯皮),导致还有一些细节需要修改,姑且记下来:

5、request.getServletPath()的取值不同,在tomcat上如果是系统根目录,则直接返回一个“/”,如果是weblogic,会返回一个空字符串,所以这里要注意下;

6、request.sendRedirect,只写相对路径是不行的,比如/front/login.do,weblogic不会帮你补上上下文路径,而tomcat会自动补上,所以,在weblogic环境下,

      浏览器会变成类似于:http://localhost:7001/front/login.do,而丢掉了应用的名称,而tomcat是正确的,会是:http://localhost:8080/应用名称/front/login.do.

      解决办法:跳转的路径变成:req.getContextPath() + "/front/login.do",这种方式同时也是兼容tomcat的。

7、session丢失的问题:

      原因:查的过程中发现使用HttpServletRequest req = ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST); req.getSession.setAttribute();的方式存储的对象

                  在后边的请求中取不到了。然后又用System.out.println(session)的方式打印两次session发现拿到的不是同一个session。

      解决办法:在weblogic.xml的weblogic-web-app做如下配置,其中cookie-name标签中配置自己的cookie名字即可;

                         <session-descriptor>
                               <cookie-name>JSESSIONID1</cookie-name>
                         </session-descriptor> 

你可能感兴趣的:(struts,weblogic)