【開發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 回車
問題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