【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 回車

問題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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章