创建maven项目出现的问题及解决

这几天在做毕业设计,需要搭建项目,当第二次碰到的时候又忘记怎么解决的了,看之前的备注以及解决方法才想起来怎么弄,今天想把所出现的问题以及解决方法进行重新整理一下,如果有错误可以一起讨论讨论,哈哈~

  • 创建web项目,没有web.xml导致pom.xml出现web.xml is missing and is set to true的错误
  • jsp页面头部信息错误 The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
  • maven依赖servlet-api和jsp-api的问题
  • maven中json-lib库无法引入
  • 如何修改maven项目名称
  • 如何修改复制项目的根路径

一、创建web项目,没有web.xml导致pom.xml出现web.xml is missing and is set to true的错误

如果你是这样创建maven项目的:

这里写图片描述

这里写图片描述

这里写图片描述
解决方法是
如果你的maven项目在创建的时候已经是war项目了,那么解决方法是:
这里写图片描述

这里写图片描述

这里写图片描述

二、jsp页面头部信息错误 The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path

当创建一个jsp就会出现这个问题,原因是缺少tomcat
解决方法是:
2.1 方法1:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

2.2方法2:

在pom.xml文件中加入:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <port>80</port>
                <path>/income</path>
            </configuration>
        </plugin>
    </plugins>
</build>

三、maven依赖servlet-api和jsp-api的问题

原代码:

    <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>

导致的错误是:

   Java.lang.ClassCastException:
            org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter

原因:

在运行的时候,容器会提供servlet-api和jsp-api这两个jar包,假如没有填写scope作用域,就会导致与tomcat中的servlet-api和jsp-api冲突,所以,这两个要加上scope为provide,使其能够在编译和测试阶段使用(为了能够让jsp编译通过)

解决方法:

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>

3.1 需要这servelt-api和jsp-api的原因:

 1. 为了能够将jsp能够正确编译
 2. jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类);jsp更擅长表现于页面显示,servlet更擅长于逻辑控制;Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到
 3.Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
3.2 Servlet的生命 周期:
第一个客户端的请求到达 Server
Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)
一个客户端的请求到达 Server
Server 创建一个请求对象,处理客户端请求
Server 创建一个响应对象,响应客户端请求
Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数
service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法。
对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

3.3 这里讲解一下scope作用域:

 1. compile(缺省值):compile表示被依赖项目参与当前项目的变异,包括测试,运行周期也参与其中,是一个**比较强的依赖**
 2. provided:表示打包的时候可以不用包进去。事实上改以来理论上可以参与编译、测试、运行等周期。相当于compile,但是在打包阶段做了exclude,也就是说再运行的时候不会发布出去
   (例如:
         对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。
        而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,**它只影响到编译,测试阶段**。
        在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,
        而在运行阶段,假定目标的容器(比如我们这里的liferay容器)已经提供了这个jar包(例如tomcat已经提供了这个jar包在运行的时候)
        ,所以无需我们这个artifact对应的jar包了。
        )
 3.  runtime,在**运行和测试**时使用,在编译阶段不使用,如JDBC驱动,适用运行和测试阶段
 4.  system:从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用
 5.   test,只在**测试**时使用,用于编译和运行测试代码。不会随项目发布。 

四、maven中json-lib库无法引入

一开始是这样写的:

这里写图片描述

错误是:
这里写图片描述

解决方法及原因:

官网上面有两个文档:
这里写图片描述
所以是因为json-lib库有两个jdk版本的实现,json-lib-2.1-jdk13.jar和json-lib-2.1-jdk15.jar,需要加上描述符即可

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

五、如何修改maven项目名称

需要两步骤:
修改
这里写图片描述

这里写图片描述

六、如何修改复制项目的根路径

这里写图片描述
这里写图片描述

发布了45 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_15006743/article/details/69228416