Maven部署过程中的ClassCastException问题

来源:互联网 发布:怎样进入淘宝直播间 编辑:程序博客网 时间:2024/06/05 10:43

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

1. 问题的引入

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. SEVERE: Exception starting filter Spring OpenEntityManagerInViewFilter  
  2. java.lang.ClassCastException: org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter cannot be cast to javax.servlet.Filter  
  3.     at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)  
  4.     at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)  
  5.     at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)  
  6.     at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)  
  7.     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)  
  8.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  9.     at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)  
  10.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  11.     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)  
  12.     at org.apache.catalina.startup.Embedded.start(Embedded.java:825)  
  13.     at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)  
  14.     at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)  
  15.     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)  
  16.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)  
  17.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)  
  18.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)  
  19.     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)  
  20.     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)  
  21.     at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)  
  22.     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)  
  23.     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)  
  24.     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)  
  25.     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)  
  26.     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)  
  27.     at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)  
  28.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  29.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  30.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  31.     at java.lang.reflect.Method.invoke(Method.java:597)  
  32.     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)  
  33.     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)  
  34.     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)  
  35.     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)  
  36. Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext filterStart  
  37. SEVERE: Exception starting filter Set Character Encoding  
  38. java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter  
  39.     at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)  
  40.     at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)  
  41.     at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)  
  42.     at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)  
  43.     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)  
  44.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  45.     at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)  
  46.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  47.     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)  
  48.     at org.apache.catalina.startup.Embedded.start(Embedded.java:825)  
  49.     at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)  
  50.     at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)  
  51.     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)  
  52.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)  
  53.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)  
  54.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)  
  55.     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)  
  56.     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)  
  57.     at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)  
  58.     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)  
  59.     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)  
  60.     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)  
  61.     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)  
  62.     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)  
  63.     at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)  
  64.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  65.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  66.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  67.     at java.lang.reflect.Method.invoke(Method.java:597)  
  68.     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)  
  69.     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)  
  70.     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)  
  71.     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)  
  72. Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext filterStart  
  73. SEVERE: Exception starting filter HiddenHttpMethodFilter  
  74. java.lang.ClassCastException: org.springframework.web.filter.HiddenHttpMethodFilter cannot be cast to javax.servlet.Filter  
  75.     at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)  
  76.     at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)  
  77.     at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)  
  78.     at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)  
  79.     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)  
  80.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  81.     at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)  
  82.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  83.     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)  
  84.     at org.apache.catalina.startup.Embedded.start(Embedded.java:825)  
  85.     at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)  
  86.     at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)  
  87.     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)  
  88.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)  
  89.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)  
  90.     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)  
  91.     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)  
  92.     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)  
  93.     at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)  
  94.     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)  
  95.     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)  
  96.     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)  
  97.     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)  
  98.     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)  
  99.     at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)  
  100.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  101.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  102.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  103.     at java.lang.reflect.Method.invoke(Method.java:597)  
  104.     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)  
  105.     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)  
  106.     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)  
  107.     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)  
  108. Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext start  
  109. SEVERE: Error filterStart  
  110. Feb 3, 2015 1:36:32 PM org.apache.catalina.core.StandardContext start  
  111. SEVERE: Context [/bsettle] startup failed due to previous errors  

2. 问题分析

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

3. 查看pom.xml

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.     <groupId>org.apache.tomcat</groupId>  
  3.     <artifactId>tomcat-servlet-api</artifactId>  
  4.     <version>7.0.56</version>  
  5. </dependency>  
  6.   
  7. <dependency>  
  8.     <groupId>org.apache.tomcat</groupId>  
  9.     <artifactId>tomcat-jsp-api</artifactId>  
  10.     <version>7.0.57</version>             
  11. </dependency>  
  这里可以看到,jsp/servlet将在整个的打包部署声明周期中被用到,并被打包到部署环境中。


4. 问题的解决

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

     故需要做如下修改:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.              <dependency>  
  2.     <groupId>org.apache.tomcat</groupId>  
  3.     <artifactId>tomcat-servlet-api</artifactId>  
  4.     <version>7.0.56</version>  
  5.     <scope>provided</scope>  
  6. </dependency>  
  7. <dependency>  
  8.     <groupId>org.apache.tomcat</groupId>  
  9.     <artifactId>tomcat-jsp-api</artifactId>  
  10.     <version>7.0.57</version>             
  11.     <scope>provided</scope>  
  12. </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 缺省值TRUETRUETRUEtestFALSETRUEFALSEruntimeFALSETRUETRUEprovidedTRUETRUEFALSE
0 0
原创粉丝点击