一位从测试转开发的同事首次更新代码,并编译在本地启动 web 项目时,报如下错误:

Exception starting filter encodingFilter
java.lang.ClassCastException: com.gaochao.platform.web.context.filter.ContextFilter2 can not be cast to javax.servlet.Filter

根据这一错误,在网上查找资料一般认为是 tomcat/lib 下的 jar 包跟 webapps 目录里的应用程序中 WEB-INF/lib 目录下有相同的包 ,存在版本上的冲突, 解决方案就是为依赖加上一个标签<scope>

顺着这个思路,我查找了关于<scope>标签的用法,如下:

* compile ,缺省值,适用于所有阶段,会随着项目一起发布。

* provided ,类似 compile ,期望 JDK 、容器或使用者会提供这个依赖。如 servlet.jar

* runtime ,只在运行时使用,如 JDBC 驱动,适用运行和测试阶段。

* test ,只在测试时使用,用于编译和运行测试代码。不会随项目发布。

* system ,类似 provided ,需要显式提供包含依赖的 jar Maven 不会在 Repository 中查找它。

但是,我们的代码里确认是有这个标签,且配置也没有错误,确实是provided 。在已经打好的 war 包里查询,路径 \oa-deploy\target\oa-deploy-0.0.1-SNAPSHOT\WEB-INF\lib中也确认没有servlet jar 包,也符合 期望 JDK 、容器或使用者会提供这个依赖 的解释。 可见问题还不是出在这个地方,进一步搜索是不是还有 其他解决思路。经过进一步查询资料, 发现在 http://jira.codehaus.org/有一个编号 MOJO-1076 的bug,其bug描述与我们的错误基本一致,另外一名用户为其提供的解决思路也是在dependency中加入<scope>属性,提报bug的用户最后加备注如下:

My issue was introduced by gwt-user.jar that contains javax.servlet package.

Setting it as provided solved the issue.

我的问题是引入gwt-user.jar,而该包中包含servlet,将该包(也可能是该包中依赖servlet)的scope改为provided即ok了。目前我们的项目里引入百数十个包,里面是不是包含servlet查找起来将是较大的工程。另外,除了这名同事以外,其他同事的tomcat启动是不是问题的。所以以上的描述只是解决类似问题的一个思路,但并不是我们问题产生的原因。

再进一步查找资料,还有前辈提供的一种方案,用以解决不同依赖中包含版本冲突的servlet的问题。在其描述中,类似本题目中的问题是由tomcat6-maven-plugin和paoding-rose两个工程的maven依赖引起,这两个依赖都依赖了servlet-api包,而且两个包的scope都设置成了运行时可用,其中tomcat6-maven-plugin为runtime,paoding-rose为compile 该方案提供的方法是使用<exclusions>元素实现。

以上是三种通过互联网查询的方案,未解决问题;又通过卸载 jdk tomcat maven 并重装等等。最终发现采用 jetty 可以启动项目。最后的解决方案,即为:重装机器,重新部署环境。

问题2:MYSQL里的ISNULL、IFNULL、NULLIF

在对工作流历史任务进行查询时,历史任务的审批人存储的用户表中的用户code,需要left join 用户表将对应的用户名称。如下:

<!-- 查询集合审批历史  -->
< select id = "queryByProcessExecutionIdForPage" resultMap = "TaskResultMap" parameterType = "String" > SELECT task.processExecutionId, process.name as processDefineName, task.activityName, user.userName as createUserCode, task.status, task.description, task.finishTime, task.createTime FROM T_BPM_PROCESS_TASK task LEFT JOIN T_BPM_PROCESS_EXECUTION execution ON task.processExecutionId = execution.id LEFT JOIN t_bpm_process_define process ON execution.processDefineId = process.id LEFT JOIN T_SYS_USER user ON task.createUserCode = user.userCode WHERE task.processExecutionId = #{id} ORDER BY task.createTime DESC, task.finishTime DESC </ select >

修改后经测试,可以达到我们想要的结果。

问题3:MySQL关于 txt 格式字段的优化

在新建工作中,会查询出所有流程定义的 list ,随着新的流程表单不断上线,打开所有流程列表的动作越来越耗时。在查询语句中使用的 select * from 字样,在流程定义所有的属性中包括了 text 格式的 jpdlXml 属性,该属性中存储了该流程的 xml 定义的文本。因为该查询只需列出流程的 id 、分类、名称,其他属性是不必须的,将 jpdlXml select 属性列表中移除,这也是 sql 优化的一个基础性的常识,不需要的字段就不要写进 select 。将 jpdlXml 移除后,耗时较长的问题并没有明显改善。我们继续向下阅读,发现还有另外一处,在查询出所有流程定义 list 后,会对该 list 进行筛选,之前的博文对这一处的逻辑进行过基于责任链模式的优化。其筛选逻辑中有这么一条——流程新发布或表单新保存后会更新流程 / 表单的某个字段,根据该字段决定新建工作中该流程是否可见。在此处代码里,会对所有流程定义 list 进行遍历,然后拿到流程对应的 form ,而查询该 form 时,也是使用的 select * ,而在 form 的定义表中,有两个字段是 text 类型的,分别为 html template 。我们再将这两个非必须字段移除,耗时问题明显改善,用户几无等待就可以看到所有流程的列表。

这一问题给我们的提示就是,查询动作尽量不用 *

问题4: tools.jar not found

为解决问题2,我也尝试在我的笔记本里(已经有一个台式机和只有显示器连接云服务器的VDI盒子,因经常开会,新申请的笔记本电脑,用于远程连接台式机,一直没有安装开发环境),拉取新的代码,按照开发环境配置新的环境,包括jdk、tomcat等,在部署的时候,报出如下错误:

Fatal error compiling: tools.jar not found: C:\Program Files\Java\jre6\..\lib\tools.jar.

网上一般对该问题的定义是eclipse中的jre配置jdk中的jre,而正确的配置应该是jdk。查找后发现并没有配置错。最后查看环境变量配置,Win+R打开cmd,输入 java -version,并没有输出版本信息,发现环境变量配置有误。

修复完毕后,再次deploy没有再发现该问题。

本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1619492 ,如需转载请自行联系原作者

java: 程序包javax.servlet不存在、 java: 程序包javax.servlet.http不存在 java: 程序包javax.servlet.annotation不存在
java: 程序包javax.servlet不存在、 java: 程序包javax.servlet.http不存在 java: 程序包javax.servlet.annotation不存在
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path类似问题简单解决方案
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path类似问题简单解决方案
Eclipse中出现The type javax.servlet.http.HttpServletRequest cannot be resolved问题
Eclipse中出现The type javax.servlet.http.HttpServletRequest cannot be resolved问题
maven jsp报错javax.servlet.http.HttpServlet“ was not found on the Java Build Path
maven jsp报错javax.servlet.http.HttpServlet“ was not found on the Java Build Path
Java Web Servlet (Part C)- HttpServletRequest & HttpServletResponse(下)
Java Web Servlet (Part C)- HttpServletRequest & HttpServletResponse
Java Web Servlet (Part C)- HttpServletRequest & HttpServletResponse(上)
Java Web Servlet (Part C)- HttpServletRequest & HttpServletResponse
The superclass “javax.servlet.http.HttpServlet“ was not found on the Java Build Path的解决方案
The superclass “javax.servlet.http.HttpServlet“ was not found on the Java Build Path的解决方案
javax异常: javax.imageio.IIOException: Can't create output stream解决方法
javax异常: javax.imageio.IIOException: Can't create output stream解决方法
GZip Servlet过滤器可用于GZip压缩内容从Java Web应用程序发送到浏览器。 为什么要压缩 Gzip压缩HTML、js、css等,使得发送给浏览器的数据大小变得更小。 JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
JavaWeb: 报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 好久不写Jsp,今天建立了一个Javaweb工程,并在eclipse中配置了Web容器Tomcat。