【maven】记第一次使用maven创建web工程遇到的坑

【开发IDE】

InteIliJ IDEA 2019.3.3 (Ultimate Edition)

JDK 13.0.2

Apache Maven 3.6.3

【问题小结】

#-> 问题1  右键无法新建Servlet文件模板

#-> 问题2  compile环境下的JDK版本问题

#-> 问题3  tomcat插件版本问题导致运行报错Compilation error


下面是详细的过程记录

创建新工程 File->New->Project->Maven,这里选择基于maven自带的骨架web-app创建一个web工程,注意要勾选Create from archetype”,才能选择下面的骨架类型。

工程创建完毕后,目录结构如图所示。

标准的web目录相比还缺少了一些文件夹,手动补齐main/javamain/resources

依次  main->New->Directory,会自动提示【java】和【resources】,直接双击即可

补充完后的目录结构如下:

在【java】目录下新建一个package【com.yy.servlet】,然后在这个包下新建一个servlet叫MyServlet.java


问题1 右键新建的时候会发现找不到Servlet这个文件模板,当然你可以直接新建一个Java Class然后自己继承HTTPServlet,但考虑开发效率,我们一般还是会通过模板直接创建更高效。

解决方法有以下两种。

#1-> 指定java为Source Roots

依次【File】->【Project Structure】->【Modules】->【Web】->【Source Roots】

指定 E:\IdeaProjects\mavenTest\src\main\javaSource Roots 点击OK,保存退出即可。

#2-> pom.xml添加servlet.jar

出现这个问题的原因是现在这个工程是通过maven直接创建的,什么jar包都没有依赖,工程无法识别servlet,所以直接在【pom.xml】 里添加servlet的jar包就可以了。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

tips:假如不清楚具体怎么写,可以到maven的中央仓库:https://mvnrepository.com/ 直接搜索所需要的jar包名称,选择合适的版本,同时会提供一段代码,如下图所示,直接将代码复制到pom.xml中即可。

添加完成以后,就能正常添加servlet文件了。这里还要注意一点,创建servlet的时候不要勾选【Create Java EE 6 annotated class】,这样创建的servlet总是找不到会报404错误,应该是地址没有指定清楚的缘故,还是手动在web.xml添加路径比较好。

web.xml手动添加servlet相关设置 

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.yy.servlet.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

打开MyServlet.java文件,编写简单的逻辑代码直接跳转到index.jsp,在doGet方法下添加

request.getRequestDispatcher("/index.jsp").forward(request,response);

doPost方法下添加

doGet(request,response);

现在的pom.xml文件是这样的

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yy</groupId>
    <artifactId>maven_web</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>maven_web Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

直接compile,这里输出了1个[WARNING]和2个[ERROR]

#->1个 [WARNING]

[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!

解决办法是在pom.xml中添加如下代码

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

 #->2个 [ERROR]

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project maven_web: Compilation failure: Compilation failure: 
[ERROR] 不再支持源选项 5。请使用 7 或更高版本。
[ERROR] 不再支持目标选项 5。请使用 7 或更高版本。

问题2 compile环境下的JDK版本问题

默认的compile插件版本是3.1,而这个版本对应的默认Java Compiler是1.5,也就是JDK 5

结合[ERROR]的输出信息自然就明白了,JDK版本太低,不再支持源选项 5。请使用 7 或更高版本

因此解决思路就是要修改jdk的版本即可。

[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven_web ---

 

解决方法也有两种方式

参照官方文档:https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

#1> 直接指定Java language的(-source)版本和JVM(-target)版本即可。

<properties>标签中直接修改,需要注意的是source版本和target版本需保持一致,例如这里使用的JDK是JavaSE 13

<project>
  [...]
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>13</maven.compiler.source>
    <maven.compiler.target>13</maven.compiler.target>
  </properties>
  [...]
</project>

另外需要注意一下有的JavaSE x完全等同于1.x,下图是JDK发布版本的命名规范。

注意从5开始就不再使用1.x的旧名,但并未完成舍弃,所以5-8这几个版本还是沿用了1.x的命名规范。假如这里想要使用Java8,下面两种写法是等价的。但最新版JavaSE13就不能这样写了。

<project>
  [...]
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  [...]
</project>

<project>
  [...]
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
  </properties>
  [...]
</project>

 #2-> <plugins>标签添加maven-compiler-plugin并指定-source和-target的版本。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>13</source>
                    <target>13</target>
                </configuration>
            </plugin>
    </plugins>
</build>

假如仅仅添加了maven-compiler-plugin,而没有指定-source和-target的版本,按照官网的说法,-source和-target默认版本是1.6。所以我特地测试了一下,结果如下,确实默认的版本就是JavaSE 6

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
</plugin>


现在通过maven工具栏中的“M”标志,执行mvn tomcat:run 

打开浏览器,输入:http://localhost:8080/maven_web_2/MyServlet 回车

------2020-07-07-更新----------------------------------

这大概是一劳永逸的方法,直接修改maven安装目录下的settings.xml,在<profiles>标签里添加如下代码,直接指定编译JDK的版本即可

<profile>
    <id>jdk-1.8</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>

 问题3 tomcat插件版本问题导致运行报错Compilation error

原因是maven自带的tomcat插件默认使用的是tomcat6,版本太低,不兼容,造成compiler error

解决方案调整Tomcat的版本,默认是6,我们这里修改成7,在<plugins>标签里添加如下代码

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <!-- <configuration>-->
    <!--     <port>8080</port>-->
    <!-- </configuration>-->
</plugin>

再次运行mvn tomcat7:run,成功!请注意这里不再是tomcat:run而是tomcat7:run

【参考资料】

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

http://tomcat.apache.org/maven-plugin-2.1/tomcat7-maven-plugin/plugin-info.html

http://www.05bk.com/714.html

https://segmentfault.com/a/1190000021673498

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值