Maven——快速入門手冊(學習記錄)

前言:

  前段時間進行了一點maven的入門學習,在這裏作個記錄,但願能幫到一些正在學習的朋友們。maven版本爲3.3.9。但願你們以爲好的點個贊,以爲很差的多提提意見和建議作個交流。這裏也貼出我學習Maven的視頻地址,你們也能夠自行觀看http://www.imooc.com/learn/443html


 

目錄:

  1. 安裝配置maven環境

  2. maven目錄結構

  3. HelloMaven

  4. 經常使用構建命令

  5. 使用archetype插件自動創建目錄

  6. 座標&倉庫

  7. 生命週期&插件的使用

  8. pom.xml經常使用標籤介紹

  9. maven依賴(範圍、傳遞、衝突)

  10. 聚合&繼承

  11. 構建規範目錄的web項目

  12. 構建非規範目錄的web項目

  13. 構建web項目中使用tomcat插件


 正文:

  1.安裝配置maven環境

    首先,在官網中下載maven組件。進入官網後,在左邊菜單找到Download選項,點擊進入Download頁面。java

      

    下拉頁面,在File下選擇合適的文件進行下載。web

      

    Maven與JDK同樣,須要配置環境變量,先創建一個M2_HOME變量,方便之後移動的時候修改路徑,隨後在Path中加入:%M2_HOME%\bin;spring

    

    配置後在控制檯輸入 mvn -v ,出現maven及jdk的相關信息即爲配置成功:apache

    

    至此,便可完成maven環境變量的配置。api

 2.maven目錄結構

  maven工程與以往的java工程目錄結構有所不一樣,以往的java工程目錄目錄通常只有一個src用於存放包及java文件,而maven工程目錄長這樣: 瀏覽器

  src
    -main
      -java
        -包
    -test
      -java
        -包緩存

  通常咱們將一些主要的內容,放在main/java下面,而測試代碼放在test/java下,這樣在運行時,maven才能夠識別目錄並進行編譯。tomcat

 3.HelloMaven

  瞭解了目錄結構後,就能夠開始第一個maven項目了。(爲了更加便於理解maven,暫時採用控制檯+記事本Editplus的操做方式,IDE將在後面使用。)
服務器

  先按照目錄結構創建好目錄:,這裏包名爲cn.edu.HelloWorld

  先編寫Hello.java:

1 package cn.edu.HelloWorld;
2 
3 public class Hello{
4     public String sayHello(){
5         return "Hello Maven";
6     }
7 }

  再編寫測試TestClass.java,這裏使用junit4框架:

 1 package cn.edu.HelloWorld;
 2 
 3 import org.junit.*;
 4 
 5 public class TestClass{
 6     @Test
 7     public void testHello(){
 8         System.out.println(new Hello().sayHello());
 9     }
10 }

   添加一個maven的配置文件pom.xml(該文件在一些開源框架中如struts,spring中能夠找到,也能夠百度進行下載,在這裏也提供一份,以供複製):

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
        <!--groupId、artifactId、version爲必需,將在後面介紹-->
    <groupId>cn.edu.HelloWorld</groupId>
    <artifactId>maven01</artifactId>
    <version>0.0.1SNAPSHOT</version>

    <dependencies>
                <!--在這裏引入junit4的依賴-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        
    </dependencies>
</project>
pom.xml

   打開控制檯,進入到工程的目錄下,執行mvn compile命令:

   

   看到BUILD SUCCESS表示編譯成功(第一次編譯可能須要下載環境比較慢)

   

  編譯成功後會在項目下生成一個target文件夾,裏面存放編譯後的文件

  

  編譯成功後執行mvn test命令,運行測試類:

   

  看到SUCCESS便可看到結果,輸出Hello Maven:

  

 4.經常使用構建命令

  來看一下maven幾個經常使用的構建命令,格式爲mvn xxx:   

    mvn
       -v 查看maven版本及其餘相關信息
       compile 編譯maven項目,並生成target文件夾
       test 運行test目錄下的測試文件,即測試
       package 將項目打包,默認打包爲jar格式,也能夠打包成war格式用於服務器運行
       install 將打包的jar文件安裝到maven本地倉庫(倉庫後面會詳細介紹)
       clean 刪除targert,至關於清除緩存

 5.使用archetype插件自動創建目錄

  在前面咱們採用手動的方式進行目錄創建,顯得略微有點繁瑣,那麼這裏介紹一個插件用於生成符合maven規範的目錄。

  首先從控制檯進入須要生成文件夾的位置,而後運行mvn archetype:generate(第一次須要下載組件比較慢,如果下載不下來能夠設置一下maven的國內鏡像庫,百度即有步驟,這裏不作介紹):

  

  出現如下界面,提示咱們選擇生成一個版本類型的maven結構,這裏選擇7(默認爲7),quickstart:

  

  確認後要求輸入groupId、artifactId(也會做爲文件夾名)、version(默認爲1.0-SNAPSHOT)、package(即包的結構),這裏依次輸入:

  

  提示確認,輸入Y確認後進行生成。出現SUCCESS,則表示生成成功:

   

  進入生成的項目中,輸入mvn compile test進行確認:

  

   

  打開文件夾便可看到咱們生成的文件目錄,已經符合了maven規範,且能夠運行。

 6.座標&倉庫

  座標:

   maven使用groupId、artifactId、version表示座標,每一個座標都惟一的指向一個maven項目,簡單介紹一下這幾個標籤

      groupId:項目組織惟一的標識符,通常爲反寫的公司網址+項目名
      artifactId:項目的惟一的標識符,通常爲項目名+模塊名
      version:版本號 x.x.x+版本類型
        第一個x表示大版本號
        第二個x表示分支版本號
        第三個x表示小版本號(可省略)
        常見版本類型:
          snapshot快照
          alpha內部測試
          beta公測
          release穩定
          GA正式發佈

      注:包名應與groupId+artifactId相吻合

   倉庫:

    maven中的依賴管理就是靠着倉庫,倉庫分爲中央倉庫及本地倉庫。在編譯項目時,maven會根據配置的依賴,先在本地倉庫中進行搜索,如果沒有則再去中央倉庫進行搜索,而搜索即是採用座標進行查找。

    默認本地倉庫位於C盤之下,若是進行還原系統之類的便會清空十分不便,這裏說一下更改本地倉庫路徑的方法:

    在maven組件目錄下的conf文件夾內,有一個setting.xml,打開文件,搜索localRepository標籤,使用localRepository標籤修改路徑便可

    

 7.生命週期&插件的使用

  生命週期:

  多個生命週期之間相互獨立。每一個生命週期含有多個階段,階段按順序執行,運行後階段時,前階段會自動執行。好比,直接運行mvn test命令,那麼執行該命令時,會自動的附帶mvn compile命令,由於test階段在compile階段以後。  

  完整的項目構建構成包括:
    清理、編譯、測試、打包、集成測試、驗證、部署

    clean 清理項目,包括如下階段:
      pre-clean 執行清理前
      clean 清理上一次構建生成的全部文件
      post-clean 執行清理後的文件
    default 構建項目(核心:經常使用),包括如下階段
      compile 編譯
      test 測試
      packeage 打包
      install 安裝
    site 生成項目站點,根據pom中信息生成項目站點,包括如下階段
      pre-site 在生成項目站點前要完成的工做
      site生成項目的站點文檔
      post-site在生成項目站點後要完成的工做
      site-deploy發佈生成的站點到服務器上

    插件:

     maven中提供了許多功能強大的插件,讓咱們更好的管理項目。一個插件一般提供了一組目標,可以使用如下語法來執行:

      mvn [plugin-name]:[goal-name]
   例如咱們以前使用mvn archetype:generate,插件名爲archetype,而目標爲generate。咱們能夠在官網的Plugins標籤下,查找到插件的座標及插件目標的詳細描述。
   Maven 提供如下兩種類型插件:
類型 描述
構建插件 在生成過程當中執行,並在 pom.xml 中的<build/> 元素進行配置
報告插件 在網站生成期間執行,在 pom.xml 中的 <reporting/> 元素進行配置

    如下是一些常見的插件列表:

插件 描述
clean 編譯後的清理目標,刪除目標目錄
compiler 編譯 Java 源文件
surefile 運行JUnit單元測試,建立測試報告
jar 從當前項目構建 JAR 文件
war 從當前項目構建 WAR 文件
javadoc 產生用於該項目的 Javadoc
antrun 從構建所述的任何階段運行一組 Ant 任務
source 從當前項目構建帶源碼的JAR文件

    這裏咱們經過使用source插件做爲例子,來看看如何在maven中配置插件:

     首先咱們快速建立一個maven項目(可使用archetype),在pom.xml中加入如下內容:

 <build>
  <!-- 配置插件集 -->
      <plugins>
          <plugin>
            <!--使用插件的座標進行引用 -->
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-source-plugin</artifactId>
              <version>3.0.0</version>
              
              <executions>
                  <execution>
                      <!-- 綁定在哪一個過程時一同執行,這裏咱們讓它在使用package打包時一同執行 -->
                      <phase>package</phase>
                    <!--執行的目標類型,關於目標的詳細介紹能夠在maven官網中查到-->
                      <goals>
                          <goal>jar-no-fork</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      </plugins>
  </build>

  接下來,在命令控制檯,輸入mvn package查看結果:

  

  

  出現成功信息後,能夠在我項目的target中找到打包後的jar文件及src-jar文件

  

   從這個例子中,咱們能夠總結出如下幾個關鍵點:

    • 插件可在 pom.xml 使用的 plugin 元素來指定
    • 能夠經過將它們綁定到其餘的過程當中一塊兒執行,這裏綁定到package中。

 8.pom.xml經常使用標籤介紹

<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">
    <!-- 當前pom的版本-->
    <modelVersion>4.0.0</modelVersion>

    <!--座標-->
    <groupId>cn.edu</groupId>
    <artifactId>maven04</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 默認是jar,其餘war zip pom等 -->
    <packaging>jar</packaging>

    <!--項目描述名 -->
    <name>maven04</name>
    <!-- 項目地址 -->
    <url>http://maven.apache.org</url>

    <!-- 配置參數 -->
    <properties>
        <!-- 這裏配置項目編譯編碼爲UTF-8-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!-- 開發人員信息 -->
    <developers></developers>
    <!-- 項目描述 -->
    <description></description>
    <!-- 許可信息 -->
    <licenses></licenses>
    <!-- 組織信息 -->
    <organization></organization>
    <!-- 依賴集,用於配置依賴 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            
            <!-- 依賴範圍:這個jar包只在範圍內生效,範圍外引用會報錯,這裏讓junit只在test時被依賴。
                            其餘一些狀況,如:servlet-api.jar,在編譯階段須要引用,而在服務器運行階段則不須要引用,就可使用scope-->
            <scope>test</scope>

            <!-- 默認爲false,子項目將會繼承,true時子項目並需顯式引用 -->
            <optional>false</optional>

            <!-- 排除依賴列表:用於去除傳遞依賴等,在後面會詳細介紹-->
            <exclusions>
                <exclusion></exclusion>
            </exclusions>
            

        </dependency>
    </dependencies>
    
    <!-- 依賴管理
            爲依賴進行統一管理,若是在父項目中聲明此標籤時,在子項目中不需聲明,確保父子項目依賴版本一致;
            如子項目須要不一樣版本的依賴,只需在子項目中進行聲明便可,將會覆蓋父項目中的聲明。
     -->
    <!--     
        <dependencyManagement>
            <dependencies>
                <dependency></dependency>
            </dependencies>
        </dependencyManagement> 
    -->
    
    <!--配置構建時的屬性-->
    <build>
        <plugins></plugins>
    </build>
    
    <!-- 指定父模塊 -->
        <!-- <parent></parent> -->

    <!-- 用於聚合編譯多個maven模塊 -->
    <modules></modules>
</project>

 9.maven依賴(範圍、傳遞、衝突)

  本節開始使用Eclipse進行編寫,使用上與控制檯方式出入不大。先略微介紹下Eclipse中構建maven項目:在新建項目時選擇maven project(需安裝maven插件,eclipse3.1以上自帶)

  

  設置好路徑後在選擇版本的界面,選擇quickstart版本:

  

  輸入信息後點擊finish便可構建maven項目:

  

  完成步驟後,通常狀況下會自動建立符合規範的maven項目。個別出現文件夾不符合規範的狀況,可使用項目右鍵→new→source folder自行建立補充。

  運行命令只要右鍵項目,run as→maven build的Goals中輸入便可,這裏輸入時不需輸入mvn。例如:mvn compile只需輸入compile。

  範圍:   

    首先要知道,maven中提供了三種classpath:編譯、測試、運行
    scope標籤
      -compile 默認,編譯測試運行均有效,會傳遞
      -provided 在編譯和測試時有效,如servletAPI能夠加入,不傳遞
      -runtime 在測試和運行時有效,如JDBCAPI能夠加入
      -test 在測試時有效,如junit能夠加入
      -system 在編譯和測試時有效,與本機系統相關聯,移植性差,在系統中之外部jar包的形式引入,不會在倉庫中查找
      -import 導入,只能用在dependecyManagement中,表示從其餘pom中導入dependecy的配置

  傳遞:

    先來看看什麼是傳遞依賴,好比如今有這麼個狀況:

    C依賴B、B依賴A——C→B→A,那麼此時C也會依賴A且會包含A中的依賴,這就是傳遞依賴。接下來咱們經過一個例子來詳細瞭解依賴及如何消除傳遞依賴:

    現有ABC三個項目:

    

  A中額外依賴了一個commons-io的jar包:

  

  B中對A進行依賴:

  

  C中對B進行依賴:

  

  保存以後能夠看到,C中不但包含B,還包含A和A依賴的common-io:

  

  那麼如何消除傳遞依賴呢,這裏就使用到<exclusion>標籤了,在C中配置依賴B的地方加入如下內容:

  

  保存後就能夠看到,C中關於A的依賴消失了,傳遞依賴的問題就解決了。

   

   衝突:

    假設如今有這麼個狀況:A依賴common-io的2.4版本,B依賴common-io的2.5版本,C依賴A、B,那麼此時C中的common-io是哪一個版本的?

    這就是依賴衝突,在maven中應對依賴衝突有兩種解決方式:短路優先,先聲明優先

      先聲明優先:顧名思義,在pom中,寫在配置文件上面的優先,好比此時A的依賴配置在B之上,那C中就爲2.4版本的common-io。

      短路優先:優先選擇依賴路徑較短的一端。假設如今多出一個D,依賴狀況改成D依賴B,C依賴A、D——C→A、C→D→B,那麼這裏就是A的依賴路徑比較短,因此爲2.4版本。

 10.聚合&繼承

  聚合:

    試想一下這樣的狀況,在一個項目中,分模塊使用了maven,那麼可能在這個項目中會有五六個,或者更多的maven項目存在。若是此時須要編譯或測試要怎麼辦呢,進入每一個maven項目中進行mvn compile麼,那就要執行五六次的compile命令,十分繁瑣,這裏就能夠用maven的聚合來解決這個問題。

    現有ABC三個工程,那麼咱們使用一個新的工程D,來聚合他們,之後只要對D進行編譯便可對三個工程同時進行編譯。使用module標籤進行聚合:

  <modules>
    <!--這裏的路徑是基於D項目的pom.xml路徑,module標籤內爲指向其餘項目的pom文件的路徑
        這裏個人ABCD項目在同一個文件夾內,那麼從D內的pom中,經過../項目名,來找到其餘項目的pom.xml-->
      <module>../A</module>
      <module>../B</module>
      <module>../C</module>
  </modules>

  繼承:

    另外一種情形,若是多個maven項目具備相同的依賴時或配置時,那麼應該如何處理呢?這裏就用到繼承的概念,在maven中使用<parent>標籤來進行繼承,下面經過一個例子來看一下:

    首先創建一個項目,命名爲parent,在parent的pom文件聲明一個common-io的依賴,不過這裏用到了dependencyManagement:

<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>cn.edu</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>parent</name>
    <url>http://maven.apache.org</url>

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

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

    <dependencyManagement>
        <!-- 在這裏聲明的依賴能夠被子項目繼承引用 -->
        <dependencies>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

  能夠看到,雖然咱們在父項目中配置了依賴,可是卻不會在父項目中被引用:

    

  在子項目B中,配置繼承parent並使用parent中的common-io版本:

<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>cn.edu</groupId>
    <artifactId>B</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>B</name>
    <url>http://maven.apache.org</url>

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

    <!-- 在parent標籤中使用父項目的座標進行配置 -->
     <parent>
          <groupId>cn.edu</groupId> 
          <artifactId>parent</artifactId> 
        <version>0.0.1-SNAPSHOT</version> 
    </parent>
    
    <dependencies>
        <!-- 此處使用依賴時,就不需聲明版本 -->
        <dependency> 
            <groupId>commons-io</groupId> 
            <artifactId>commons-io</artifactId> 
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

   配置後保存便可看到,此處的依賴版本即爲父項目中的版本:

  

 11.構建web項目

  這裏介紹兩種的web項目:規範目錄的web項目及傳統目錄的web項目。再介紹使用兩種服務器容器:tomcat和jetty運行的方法。因爲tomcat中有許多的須要注意的問題,較爲複雜,因此這裏先從簡單的jetty入手。

  首先構建項目,此次選擇版本的時候咱們選擇webapp:

  

  創建好後的webapp項目,其目錄結構是這樣的:

  

  這裏的resources文件夾用於存放java文件、包、xml配置文件等等,與咱們傳統意義上的src文件夾是一致的。這裏src下的webapp文件夾則等同於咱們Web項目中的WebRoot或WebContent,一些頁面和樣式等文件放在這個目錄下。

  接下來看看pom文件:

  先注意到咱們這裏的打包方式變爲了war,web項目必需先編譯打包,而後才能部署到web容器上運行。以後只需配置咱們的jetty運行插件。

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.edu</groupId>
    <artifactId>mavenweb</artifactId>
    <packaging>war</packaging>
    <version>1.2.2-SNAPSHOT</version>

    <name>mavenweb Maven Webapp</name>

    <url>http://maven.apache.org</url>

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

    <build>
        <finalName>mavenweb</finalName>
        <plugins>
            <!--這裏用到jetty的插件,在官網中能夠找到座標-->
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.1.v20170120</version>
            </plugin>
        </plugins>
    </build>
</project>
        

  先使用package命令進行打包,能夠看到target中出現了咱們webapp文件夾下的內容,以及打包好的war文件。

   

  複製使用這個war文件也可完成部署。但咱們這裏使用jetty插件,在命令框中輸入jetty:run命令,觀察到

說明服務器啓動完成。

  接下來在瀏覽器使用localhost:8080便可看到咱們的項目中的index.jsp

  

  至此就完成了咱們規範目錄的web項目構建。

 12.構建非規範目錄的web項目

  使用maven的web項目結構,可能會有少量的不習慣,或者咱們要將之前開發的項目轉爲mavenweb項目的話,那要怎麼辦呢?這裏就介紹下非規範目錄的web項目要如何構建。

   首先,這是咱們的項目目錄結構,java等文件仍是放在main/java下,而頁面等其餘資源文件放在WebContent下:

  

  看看pom文件中的配置方法:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.edu</groupId>
    <artifactId>mavenweb</artifactId>
    <packaging>war</packaging>
    <version>1.2.2-SNAPSHOT</version>
    <name>mavenweb Maven Webapp</name>
    <url>http://maven.apache.org</url>

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

    <build>
        <finalName>mavenweb</finalName>
        <!-- 資源集 -->
        <resources>
            <!-- 非規範資源文件目錄打包 -->
            <resource>
                 <!-- 指定資源存放的目錄(必需,不寫會報錯),即resources目錄的變動。如下配置中的的相對目錄改成該目錄 -->
                <directory>src/main/java</directory>
                <includes>
                    <include>*.xml</include>
                </includes>
                <!-- 是否替換資源文件中的屬性,如${username},替換爲pom中指定的properties-->  
                <filtering>false</filtering>    
            </resource>
        </resources>
        <plugins>
                        <!--這裏使用到war plugin,一樣的,詳細介紹及座標在官網中能夠找到-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <!-- 指定web.xml的文件位置 -->
                    <webXml>WebContent/WEB-INF/web.xml</webXml>
                    <!-- war的源目錄,由哪一個文件夾打包成war文件,用於更改頁面樣式等的資源目錄 -->
                    <warSourceDirectory>WebContent</warSourceDirectory>        
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.1.v20170120</version>
            </plugin>
        </plugins>
    </build>
</project>

  完成配置後,使用package命令進行打包。看到target中的打包結果,確實更改了來源目錄並打包成功:

  

  

   接下來使用jetty:run或jetty:deploy等運行命令便可成功運行項目。

 13.構建web項目中使用tomcat插件

  使用tomcat時,會趕上許多的問題,在這裏整理,但願能幫上一些朋友。

  問題一:tomcat插件版本問題

  tomcat這個插件在官網的描述中是這樣的:

  

  那麼我這裏使用的是tomcat7,我就使用了下面的那份座標,可是在使用tomcat:run命令是發現:

   

  也是找了很久才發現這個問題,我明明使用的是tomcat7的插件,可是運行起來倒是不知道哪裏來的6.0版本。

  正確的方式是:運行tomcat7:run命令,其實這點在官網中也有提到,怪本身沒認真看了。

   

  tomcat:run默認使用的是6.0版本的tomcat,可是奇怪的一點,我機子上並無6.0版本的tomcat,那麼這裏的是哪來的呢?但願有大神知曉的可以解答,先謝過了!

  問題二:Cannot invoke Tomcat manager: Server rened HTTP response code: 403 for URL

  這個問題,第一是要打開tomcat的Manage權限,在百度有許多相關的解決方法,我就很少說了。這裏貼幾個我以爲寫的還不錯的帖子:

  http://blog.csdn.net/u012052168/article/details/52448943

  https://my.oschina.net/angel243/blog/178554

  第二個點,也是我趕上的主要問題:Eclipse的tomcat的webapp目錄爲workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps,而並不是$CATALINA_HOME/webapp,這也就致使了Eclipse中啓動tomcat的話,是沒有Root、Manage等項目的,更不用說Manage權限了。

  解決方式:http://blog.csdn.net/snakewarhead/article/details/6175833

  最後,貼上最終個人pom文件,供你們作個參考:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.edu</groupId>
    <artifactId>mavenweb</artifactId>
    <packaging>war</packaging>
    <version>1.2.2-SNAPSHOT</version>
    <name>mavenweb Maven Webapp</name>
    <url>http://maven.apache.org</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>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.5.8</version>
        </dependency>

    </dependencies>

    <build>

        <finalName>mavenweb</finalName>
        <!-- 資源集 -->
        <resources>
            <!-- 非規範資源文件目錄打包 -->
            <resource>
                 <!-- 指定資源存放的目錄(必需,不寫會報錯)基礎目錄,如下目錄全在該目錄下 -->
                <directory>src/main/java</directory>
                <includes>
                    <include>*.xml</include>
                </includes>
                <!-- 是否替換資源文件中的屬性,如${username},替換爲pom中指定的properties-->  
                <filtering>false</filtering>    
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <!-- 指定web.xml的文件位置 -->
                    <webXml>WebContent/WEB-INF/web.xml</webXml>
                    <!-- war的源目錄,由哪一個文件夾打包成war文件,用於更改資源目錄 -->
                    <warSourceDirectory>WebContent</warSourceDirectory>    
<!--                     <webappDirectory>WebContent</webappDirectory> 打包的目標目錄-->    
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <url>http://localhost:8080/manager/html</url>
                    <server>tomcat7</server> <!-- 此處的名字必須和setting.xml中配置的ID一致 -->
                    <username>admin</username>
                    <password>root</password>
                    <path>/mavenweb</path> <!-- 此處的名字是項目發佈的工程名 -->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.1.v20170120</version>
            </plugin>
        </plugins>
    </build>
</project>
pom.xml
相關文章
相關標籤/搜索