Maven Tomcat 插件使用
1、在pom.xml中添加
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/${project.artifactId}</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
2、在使用Maven做简单的Web项目开发时,碰到以下问题,记录如下。
在项目中依赖了如下资源。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
项目中只有一个Servlet,继承于HttpServlet。
内容如下:
一个简单的JSP文件,内容如下:
在使用Tomcat插件运行该工程时,第一次提示ClassCastException异常,提示说HelloServlet cannot cast to java.servlet.Servlet,
后来将javax.servlet-api的依赖范围改为provided后问题解决。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
再次运行,提示NullPointerException异常,异常信息如下:
org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:538)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:370)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause:
java.lang.NullPointerException
org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:164)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
后将对asp-api的依赖范围修改为provided后问题解决。
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
问题原因分析:
两个问题应该都是因为jar包冲突引起的,项目中引用的jar包仔Tomcat中存在一份,所以导致冲突。
问题解决方法:
在Maven中,使用scope属性决定某个依赖包的使用范围,这里使用provided值表示该依赖只在编译和测试中用到,而不会打包到部署环境中。在开发Web工程中需要注意,由于无法预知最终部署的Web服务器的版本和类型,这两个包最好是只在编译和测试中使用,避免打包到部署环境。
Maven scope属性用来声明依赖的范围,可以使用5个值:
compile,缺省值适用于所有阶段,会随着项目一起发布。
provided,类似compile,如果使用该属性,表示JDK、Web容器或使用者会提供这个依赖。如servlet-api.jar,依赖不会随项目一起发布。
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system,类似provided,本地依赖时使用该属性,显式提供包含依赖的jar包路径,Maven不会在Repository中查找它。一定要配合systemPath属性一起使用。示例:
<dependency>
<groupId>org.apache</groupId>
<artifactId>test</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/test.jar</systemPath>
</dependency>