1. 程式人生 > 其它 >Java:Maven(二)

Java:Maven(二)

Maven常用命令

我們可以在cmd中通過一系列的maven命令來對我們的maven-helloworld工程進行編譯、測試、執行、打包、安裝、部署。

compile

compile是maven工程的編譯命令,作用是將src/main/java下的檔案編譯為class檔案輸出到target目錄下。

cmd進入命令狀態,執行mvn compile,如下圖提示成功:

檢視 target目錄,class檔案已生成,編譯完成。


test

test是maven工程的測試命令 mvn test,會執行src/test/java下的單元測試類。
cmd執行mvn test執行src/test/java下單元測試類,下圖為測試結果,執行 1 個測試用例,全部成功。

clean

clean是maven工程的清理命令,執行 clean會刪除target目錄及內容。

package

package是maven工程的打包命令,對於java工程執行package打成jar包,對於web工程打成war包。

install

install是maven工程的安裝命令,執行install將maven打成jar包或war包釋出到本地倉庫。
從執行結果中,可以看出:
當後面的命令執行時,前面的操作過程也都會自動執行,

Maven指令的生命週期

maven對專案構建過程分為三套相互獨立的生命週期,請注意這裡說的是“三套”,而且“相互獨立”,
這三套生命週期分別是:

  1. Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
  2. Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
  3. Site Lifecycle 生成專案報告,站點,釋出站點。

maven的概念模型

Maven包含了一個專案物件模型 (Project Object Model),一組標準集合,一個專案生命週期(ProjectLifecycle),一個依賴管理系統(Dependency Management System),和用來執行定義在生命週期階段(phase)中外掛(plugin)目標(goal)的邏輯。

  1. 專案物件模型 (Project Object Model)
    一個maven工程都有一個pom.xml檔案,通過pom.xml檔案定義專案的座標、專案依賴、專案資訊、外掛目標等。

  2. 依賴管理系統(Dependency Management System)
    通過maven的依賴管理對專案所依賴的jar 包進行統一管理。
    比如:專案依賴junit4.9,通過在pom.xml中定義junit4.9的依賴即使用junit4.9,如下所示是junit4.的依賴定義:

點選檢視程式碼
<!-- 依賴關係 -->
<dependencies>
<!-- 此專案執行使用junit,所以此專案依賴junit -->
<dependency>
<!-- junit的專案名稱 -->
<groupId>junit</groupId>
<!-- junit的模組名稱 -->
<artifactId>junit</artifactId>
<!-- junit版本 -->
<version>4.9</version>
<!-- 依賴範圍:單元測試時使用junit -->
<scope>test</scope>
</dependency>
  1. 一個專案生命週期(Project Lifecycle)
    使用maven完成專案的構建,專案構建包括:清理、編譯、測試、部署等過程,maven將這些過程規範為一個生命週期,如下所示是生命週期的各各階段:

maven通過執行一些簡單命令即可實現上邊生命週期的各各過程,比如執行mvn compile執行編譯、執行mvn clean執行清理。

  1. 一組標準集合
    maven將整個專案管理過程定義一組標準,比如:通過maven構建工程有標準的目錄結構,有標準的生命週期階段、依賴管理有標準的座標定義等。

  2. 外掛(plugin)目標(goal)
    maven 管理專案生命週期過程都是基於外掛完成的。

idea開發maven專案

在實戰的環境中,我們都會使用流行的工具來開發專案。

idea的maven配置

開啟->File->Settings配置maven

依據圖片指示,選擇本地maven安裝目錄,指定maven安裝目錄下conf資料夾中settings配置檔案。


idea中建立一個maven的web工程

我的idea版本是2019

  1. 開啟idea,選擇建立一個新工程.選擇idea提供好的maven的web工程模板

  2. 點選Next填寫專案資訊

  3. 點選Finish後開始建立工程,耐心等待,直到出現如下介面。


建立一個Servlet

src/java/main建立了一個Servlet,但報錯

要解決問題,就是要將servlet-api-xxx.jar包放進來,作為maven工程應當新增servlet的座標,從而匯入它的jar

在pom.xml檔案新增座標

直接開啟、工程的pom.xml檔案,再新增座標

新增jar包的座標時,還可以指定這個jar包將來的作用範圍。
每個maven工程都需要定義本工程的座標,座標是maven對jar包的身份定義,比如:入門程式的
座標定義如下:

<!--專案名稱,定義為組織名+專案名,類似包名-->
<groupId>com.itheima</groupId>
<!-- 模組名稱 -->
<artifactId>hello_maven</artifactId>
<!-- 當前專案版本號,snapshot為快照版本即非正式版本,release為正式釋出版本 -->
<version>0.0.1-SNAPSHOT</version>

:打包型別
jar:執行package會打成jar包
war:執行package會打成war包
pom :用於maven工程的繼承,通常父工程設定為pom


座標的來源方式

新增依賴需要指定依賴jar包的座標,但是很多情況我們是不知道jar包的的座標,可以通過如下方式查詢:

從網際網路搜尋

http://search.maven.org/
http://mvnrepository.com/

依賴範圍

A依賴B,需要在A的pom.xml檔案中新增B的座標,新增座標時需要指定依賴範圍,依賴範圍包
括:

  1. compile:編譯範圍,指A在編譯時依賴B,此範圍為預設依賴範圍。編譯範圍的依賴會用在編譯、測試、執行,由於執行時需要所以編譯範圍的依賴會被打包。

  2. provided:provided依賴只有在當JDK或者一個容器已提供該依賴之後才使用, provided依賴在編譯和測試時需要,在執行時不需要,比如:servlet api被tomcat容器提供。

  3. runtime:runtime 依賴在執行和測試系統的時候需要,但在編譯的時候不需要。比如:jdbc的驅動包。由於執行時需要所以runtime範圍的依賴會被打包。

  4. test:test範圍依賴 在編譯和執行時都不需要,它們只有在測試編譯和測試執行階段可用,
    比如:junit。由於執行時不需要所以test範圍依賴不會被打包。

  5. system:system範圍依賴與provided類似,但是你必須顯式的提供一個對於本地系統中JAR檔案的路徑,需要指定systemPath磁碟路徑,system依賴不推薦使用。

在maven-web工程中測試各各scop。

測試總結:
預設引入 的jar包 ------- compile 【預設範圍 可以不寫】(編譯、測試、執行 都有效 )
servlet-api 、jsp-api ------- provided (編譯、測試 有效, 執行時無效 防止和tomcat下jar衝突)
jdbc驅動jar包 ---- runtime (測試、執行 有效 )
junit ----- test (測試有效)
依賴範圍由強到弱的順序是:compile>provided>runtime>test

專案中新增的座標

設定jdk編譯版本

本教程使用jdk1. 8 ,需要設定編譯版本為1. 8 ,這裡需要使用maven的外掛來設定:
在pom.xml中加入:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1. 8 </source>
        <target>1. 8 </target>
      <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
  </plugins>
</build>

編寫servlet

在src/main/java中建立ServletTest
內容如下:

編寫jsp

在web.xml中配置servlet訪問路徑

	<servlet>
		<servlet-name>servletDemo</servlet-name>
		<servlet-class>servlet.ServletDemo</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>servletDemo</servlet-name>
		<url-pattern>/demo</url-pattern>
	</servlet-mapping>

新增tomcat7外掛

在pom檔案中新增如下內容

此時點選idea最右側Maven Projects,
就可以看到我們新新增的tomcat7外掛
雙擊tomcat7外掛下tomcat7:run命令直接執行專案

執行結果


端口占用處理

重新執行tomcat:run命令重啟工程,重啟之前需手動停止 tomcat,否則報下邊的錯誤:

座標定義

在pom.xml中定義座標,內容包括:groupId、artifactId、version,詳細內容如下:

<!--專案名稱,定義為組織名+專案名,類似包名-->
<groupId>cn.itcast.maven</groupId>
<!-- 模組名稱 -->


<artifactId>maven-first</artifactId>
<!-- 當前專案版本號,snapshot為快照版本即非正式版本,release為正式釋出版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包型別
jar:執行package會打成jar包
war:執行package會打成war包
pom :用於maven工程的繼承,通常父工程設定為pom

pom基本配置

pom.xml是Maven專案的核心配置檔案,位於每個工程的根目錄,基本配置如下:

<project > :檔案的根節點.
<modelversion > : pom.xml使用的物件模型版本
<groupId > :專案名稱,一般寫專案的域名
<artifactId > :模組名稱,子專案名或模組名稱
<version > :產品的版本號.
<packaging > :打包型別,一般有jar、war、pom 等
<name > :專案的顯示名,常用於 Maven 生成的文件。
<description > :專案描述,常用於 Maven 生成的文件
<dependencies> :專案依賴構件配置,配置專案依賴構件的座標
<build> :專案構建配置,配置編譯、執行外掛等。

參考黑馬,侵刪