Maven JavaWeb工程初探

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>     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值