Maven部署过程中的ClassCastException问题

引言: Maven功能强大,但是又有些复杂,难以捉摸和使用。在本人开发中碰到了一个ClassCastException的问题,通过这个问题的解决,加深了对于maven依赖管理中scope的理解。

1. 问题的引入

部署环境tomcat 7, 开发中使用的框架spring,spring data,hibernate之类的,基于Maven部署过程中,会出现以下异常信息:

SEVERE: Exception starting filter Spring OpenEntityManagerInViewFilter
java.lang.ClassCastException: org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter cannot be cast to javax.servlet.Filter
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
	at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
	at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)
	at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter Set Character Encoding
java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
	at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
	at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)
	at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter HiddenHttpMethodFilter
java.lang.ClassCastException: org.springframework.web.filter.HiddenHttpMethodFilter cannot be cast to javax.servlet.Filter
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
	at org.apache.catalina.startup.Embedded.start(Embedded.java:825)
	at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)
	at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext start
SEVERE: Context [/bsettle] startup failed due to previous errors

2. 问题分析

这几个Servlet都是在web.xml中配置的Filter,其配置没有问题。错误类型为ClassCastException, 就是其实现的Filter与目标的Filter存在不同,就是说有可能是类库引用的不同,导致在启动过程中,出现这样的问题。

3. 查看pom.xml

在开发中,引入了如下包,用以解决Servlet/JSP中常用类库的引用问题,这些都是在Web服务器中实现的类库。

		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-servlet-api</artifactId>
			<version>7.0.56</version>
		</dependency>

		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jsp-api</artifactId>
			<version>7.0.57</version>
		</dependency>

这里可以看到,jsp/servlet将在整个的打包部署声明周期中被用到,并被打包到部署环境中。

4. 问题的解决

由于无法预知最终部署的Web服务器的版本和类型,故这里的这两个依赖在编译、测试中会用到,但是在部署环境中,是不能打包到部署环境中去的。

故需要做如下修改:

               <dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-servlet-api</artifactId>
			<version>7.0.56</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jsp-api</artifactId>
			<version>7.0.57</version>
			<scope>provided</scope>
		</dependency>

5. Scope的含义和使用

<dependency>中<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:

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

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

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

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

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

依赖范围(scope) 主源码classpath可用 测试源码classpath可用 会被打包
compile 缺省值 TRUE TRUE TRUE
test FALSE TRUE FALSE
runtime FALSE TRUE TRUE
provided TRUE TRUE FALSE
时间: 2024-11-07 19:10:28

Maven部署过程中的ClassCastException问题的相关文章

Rancher 2.0部署过程中常见问题分析与解决

本文是Rancher 2.0部署与使用过程中常见的问题及其解决方法,多数问题整理收集自Rancher官方技术交流群内用户的提问与反馈.欢迎扫描文末二维码,添加Rancher小助手为好友,加群获得更多技术支持. 本文主要内容为: 1.部署Rancher 2.0的环境需求 推荐使用的操作系统 推荐的硬件配置 支持的docker版本 防火墙需要允许通过的端口 2.部署过程中的常见问题及排查思路 环境信息残留 openssh版本过低问题 nodeport端口只有一台机器能访问 部署使用calico网络部

ADFS部署过程中设置network service对证书的读取权限

今儿在部署客户正式环境的ADFS时候遇到一问题,在配置完基于声明的身份验证后通过url访问居然报错了,这干过N回的事怎么会出错了呢,百思不得其解 网页报错如下 系统日志报错如下, 回想过程中的每一步,突然想到这回好像没对证书做什么操作,因为证书是客户买的由他们IT人员导入好了的,我就直接在绑定的时候选择下就行了,所以少了一步操作.通过管理工具点开证书右击所有任务-管理私钥-添加NetWork Service,再次访问就没问题了. 下图取自勇哥的博客

maven 学习:为什么要使用maven,maven使用过程中的一些参数

Maven是一个基于Java平台的项目构建工具. 设计的出发点: 在进行软件开发的过程中,无论什么项目,采用何种技术,使用何种编程语言,我们要重复相同的开发步骤:编码,编译,测试,生成文档,打包发布.实际上除了编写源代码,其他步骤完全是重复一些琐碎的工作,这些琐碎的工作就是构建. 那为什么让软件开发人员去重复这些工作?开发人员的主要任务应该是关注商业逻辑并去实现它,而不是把时间浪费在学习如何在不同的环境中去打包,发布,Maven正是为了将开发人员从这些重复性的任务中解脱出来而诞生的. Maven

Maven包装过程中跳过测试

在具体项目,步骤需要跳过假设检验,应采取skipTests此属性设置为true. <pre name="code" class="html"><project> [...] <!--http://blog.csdn.net/redstarofsleep--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins<

在Eclipse开发Webapp部署过程中,缓存的位置设置

引言: 在Eclipse中进行Web开发,一般都会将项目直接在Eclipse中集成的Tomcat进行开发.那Webapp部署到哪里了呢?缓存的位置能否切换呢? 1.  查看当前Webapp项目缓存位置 点击Tomcat服务器,就可以进入Server Overviews的界面了.注意: 如果当前Tomcat下有webapps应用,则无法进行编辑ServerLocations. 2.  如何进行Server Locations(项目缓存位置的设置)的切换? 清除当前Tomcat服务器下的Webapp

SpringMVC之旅-开发到部署过程中遇到的问题整理(不断更新)

开发中: 第一个问题:我在做一个APP的后台服务接口的时候遇到一个问题.在SpringMVC中有两个注解,@RequestBody和@ResponseBody.@RequestBody的作用是将输入参数为json时将json数据转换为java对象,@ResponseBody的作用是将输出结果的java对象转换成json数据. 开始我没有加入@ResponseBody,我发现在Android端使用Volley访问接口的时候返回的总是404错误,我一直没找到问题,后来我在电脑端访问接口的时候发现返回

Openstack部署总结之:部署过程中“Error: Local ip for ovs agent must be set when tunneling is enabled”的问题

问题描述 在使用RDO进行多节点部署测试的时候,由于采用了几台破旧的机器且机器的型号存在差异(有的的HP的PC,有的是DELL的PC),出现了以下的错误: Applying 192.168.40.107_neutron.pp 192.168.40.107_neutron.pp: [ DONE ] 192.168.40.248_neutron.pp: [ DONE ] 192.168.40.105_neutron.pp: [ ERROR ] Applying Puppet manifests [

29Exchange Server 2010跨站点部署-部署过程中遇到的问题

在部署跨站点后,在一个站点打开EMC控制台后,管理其它站点的虚拟目录就会报错 在EMS也会提示相同的错误 在上海站点运行命令: 在广州站点运行命令: 以上遇到的错误还请各位大神指点!

项目部署过程中 解决页面乱码问题的经历

本文转载自http://blog.163.com/lucia_gagaga/blog/static/26476801920167256342858/ 项目部署完毕之后 数据库里面的数据读到页面上是乱码 就像这样子: 为 了解决这个乱码问题 花费了一周的时间 请教了好多老师同学同事最后是做了这么几件事才给搞好的:1. 借助 notepad++ 把 .sql 文件的编码格式改成 utf82. 替换 mysql 的 my.cnf 文件 并加入指定字符集的语句3. 使用终端命令重新导入 .sql 文件4