以前常在Maven中用Jetty插件。由于系统的正式部署环境为Tomcat,因此把设置了Tomcat插入,可在使用过程中一直出错;现将设置过程中的错误整理了一个为广大初学者一些提示。以免在这些上面浪费时间。
系统原配置为Jetty插件。配置信息如下:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
<configuration>
<scanIntervalSeconds>3</scanIntervalSeconds>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
由于真实的部署环境为Tomcat,因此需要将Jetty插件改为Tomcat插件。使开发环境更接近于真实环境。因此新的配置如:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<path>/</path>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
但是设置为Tomcat插件后。问题不断。错误如下:
java.lang.ClassCastException: org.springframework.web.filter.DelegatingFilterProxy 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)
从网上查找原因,说是servlet-api.jar包引起的冲突。因此Tomcat6及以上版本中自带servlet-api,因此两个不同jar之间引发此冲突。因此将原有代码
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
改为
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
熟悉MAVEN的朋友应该都知道(
<scope>provided</scope>)的含义,这里不做介绍。
然后通过(tomcat:run)命令启动Tomcat,可是上面的错误依旧存在。
因此我打开(POX.XML)选择(Dependency Hierarchy)选择,查看系统有哪些依赖。发现在(Resolved Dependencies)选择卡中存在(javax.servlet-api)。因此需要将这个jar的依赖给删除。而这个jar是通过其他jar自动依赖的,因此需要加入下面的代码
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>shiro-freemarker-tags</artifactId>
<version>${shiro-freemarker-tags-version}</version>
<exclusions>
<exclusion>
<artifactId>javax.servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
因外也可以在javax.servlet-api这个选项中右击,选择( Exclude Maven Artifact...)会弹出一个对话框,选择不想依赖的jar单击确定即可。
重新运行tomca:run之后系统正常。