【开发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/java和main/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\java 为 Source 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