在部署客户发来的Web项目的时候遇到了很闹心的问题:
先把客户工程的目录结构写下来。
-Folder
|---.settings
| -build
| +classes
| -src
| +mycompany
| resources
| -WebContent
| css
| image
| js
| META-INF
| +pages
| -WEB-INF
| +lib
| +tags
| struts-bean.tld
| struts-config.xml
| struts-html.tld
| struts-logic.tld
| tiles-defs.xml
| validation.xml
| validator-rules.xml
| web.xml
| test.html
部署过程大概是这样的:
1.新建动态Web工程,命名为myproj 下一步,下一步,确定。
2.导入客户的工程。在刚刚新建的myproj工程-右键-导入- 按提示导入上面的Folder目录。
3.设定JDK,将TomcatLib导入到工程中。
4.myproj工程-右键-Tomcat ---设为TOMCAT项目
Context名:/myproj (这样访问站点的时候就可以键入http://localhost:8080/myproj/XXXXX.html)
作为Web应用程序根目录的子目录(可选):/WebContent (如果src目录和WEB-INF目录是同级目录,那这里可写成'/')
5.clean,rebuild
6.启动Tomcat服务器
7.打开Webbrowser 键入http://localhost:8080/myproj/test.html 静态页面正常显示。
8.在画面中点login按钮,在正常情况下它会走loginAction,但是它没有走,而且抛异常:
javax.servlet.ServletException
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at net.skirnir.catalina.servlets.MultipartFilter.doFilter(MultipartFilter.java:69)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at mycompany.co.portal.common.server.authentication.LoginFilter.doFilter(LoginFilter.java:209)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:831)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:652)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1203)
at java.lang.Thread.run(Thread.java:595)
javax.servlet.ServletException
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at net.skirnir.catalina.servlets.MultipartFilter.doFilter(MultipartFilter.java:69)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at mycompany.co.portal.common.server.authentication.LoginFilter.doFilter(LoginFilter.java:209)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:831)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:652)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1203)
at java.lang.Thread.run(Thread.java:595)
我在loginAction中的execute方法中第一行加了断点,但是没有反应。异常照样抛。
客户说他们的代码绝对没有问题,也就是说struts-config.xml和web.xml中的配置没什么问题。
不过似乎struts框架根本就没有跑起来。什么原因?
问题解决:
直到现在我还不敢相信问题的解决会如此的简单。
1.myproj工程-右键-属性-javaBuildPath中的[默认输出路径]选为/myproj/WebContent/WEB-INF/classes
(原来这里的值为/myproj/build/classes)
2.rebuild.
3.进入页面,LOGIN,成功显示!问题解决!
问题分析:
看来问题大概是在[默认输出路径]上面。
为了搞清问题的原因,我做了如下实验:
1. /myproj/WebContent/WEB-INF/下的classes文件夹删除,并把[默认输出路径]设为[/myproj/build/classes]
编译,运行。NG。
2. 把[默认输出路径]设为[/myproj/WebContent/WEB-INF/classes] 编译,运行OK。
3.把[默认输出路径]设回为[/myproj/build/classes],并且保留/myproj/WebContent/WEB-INF/下的classes文件夹
编译,运行。OK。
4.把[默认输出路径]设回为[/myproj/build/classes],并且删除/myproj/WebContent/WEB-INF/下的classes文件夹
编译,运行。NG。
[默认输出路径]的设定一般保存在工程下的.classpath文件中,里面有一行是:
<classpathentry kind="output" path="build/classes"/>
把里面的path设为[/myproj/WebContent/WEB-INF/classes]就行了。
问题是解决了。但是还是搞不清楚其根本原因。为什么编译好的字节码文件必须放到WEB-INF下的classes文件夹里
是不是Tomcat运行Web程序的时候只认/WEB-INF/classes呢?如果换成weblogic又会是什么结果呢?看来菜鸟还是菜鸟,还有待老鸟们赐教。
我想解决问题并不能算是高手,真正的高手不仅要能解决问题还要能分析出问题出现的根本原因。