1. 程式人生 > 實用技巧 >初始自動化構建工具-Maven

初始自動化構建工具-Maven

             

01 自動化構建工具:Maven
   瀏覽器
   表示層、表述層、表現層:①檢視層:H5、CSS、JS、JSP等 ②控制層:Servlet、Action(Struts2)、Handler(SpringMVC)等
   業務邏輯層:Spring IOC / AOP
   持久化層:JDBC、DBUtils、SpringTemplate、Hibernate、Mybatis
   資料庫:Mysql、Oracle

02 目前的技術在開發中存在的問題
  ① 一個專案就是一個工程
  ② 專案中需要的jar包必須手動"複製"、"貼上"到 WEB-INF / lib 目錄下
  ③ jar 包需要別人替我們準備好,或到官網下載
  ④ 一個 ja r包依賴的其它 jar 包需要自己手動加入到專案中,FileUpload元件->IO元件

03 Maven是什麼
  ① Maven一款服務於Java平臺的自動化構建工具。
    Make-->Ant-->Maven-->Gradle
  ② 構建
    (1)概念:以"Java原始檔","框架配置檔案","JSP","HTML","圖片"等資源為原材料,去"生產"一個可以執行的專案的過程
        編譯,部署,搭建
    (2)編譯:Java 原始檔(User.java)->編譯->Class位元組碼檔案(User.class)->交給JVM去執行
    (3)部署:一個 BS 專案最終執行的並不是動態Web 工程本身,而是這個動態 Web 工程的"編譯結果":動態Web工程->編譯、部署->編譯結果
  動態 Web 工程目錄結構:
  工程名
    src  原始碼
    JRE System Library  執行時環境
    Apache Tomcat v6.0  執行時環境

    build  原始碼的位元組碼檔案
    WebContent  前端頁面展示
      META-INF
      WEB-INF
        lib
        web.xml
      index.jsp
  ③構建過程中的各個環節
   (1)清理:將以前編譯得到的舊的 class 位元組碼檔案刪除,為下一次編譯做準備
   (2)編譯:將 Java 源程式編譯成 class 位元組碼檔案
   (3)測試:自動測試,自動呼叫 junit 程式
   (4)報告:測試程式執行的記過
   (5)打包:動態 Web 工程打war 包,Java工程打 jar 包
   (6)安裝:Maven 特定的概念--將打包得到的檔案複製到"倉庫"中指定位置
   (7)部署:將動態 Web 工程生成的war 複製到 Servlet 容器的指定目錄下,使其可以執行
  ④自動化構建

04 安裝 Maven核心程式
  ① 檢查 JAVA_HOME 環境變數
  ② 解壓Maven 核心包檔案,放在一個無中文無空格的路徑下
  ③ 配置Maven 相關環境變數
   (1)MAVEN_HOME或M2_HOME :Maven核心包解壓後的路徑
   (2)Path:追加Maven核心包解壓後的路徑 / bin
  ④ 驗證:執行 mvn -v,檢視 Maven 版本

05 Maven的核心概念
  ① 約定的目錄結構
  ② POM
  ③ 座標
  ④ 依賴
  ⑤ 倉庫
  ⑥ 生命週期/外掛/目標
  ⑦ 繼承
  ⑧ 聚合

06 第一個 Maven 工程
  ① 建立 Maven 約定的目錄結構
  Hello  工程名
  |  src  原始碼
  |  |  main  主程式
  |  |  |  java  Java原始檔
  |  |  |  resources  存放框架或其它工具配置檔案
  |  |  test  測試程式
  |  |  |  java
  |  |  |  resources
  |  pom.xm  Maven配置核心檔案

  ② 為什麼要遵守約定的目錄結構
    約定 > 配置 > 編碼
  ③ pom.xml 檔案

07 常用Maven 命令
  ① 注意:執行與構建過程相關的Maven的命令時,需要進入pom.xml所在目錄
   與構建過程相關:編譯,測試,打包
  ② 常用命令:
   (1)mvn clean:清理
   (2)mvn compile:編譯主程式
   (3)mvn test-compile:編譯測試主程式
   (4)mvn test:執行測試
   (5)mvn package:打包
   (6)mvn install:安裝
   (7)mvn site:生成站點

08 關於聯網問題
  ① Maven 的核心程式中僅僅定義了抽象的宣告週期,但是具體的工作必須由特定的外掛來完成,而外掛本身並不包含在 Maven 的核心程式中。
  ② 當我們指定的 Maven 命令需要用到某些外掛時,Maven 核心程式會首先到本地倉庫中查詢。
  ③ 本地倉庫的預設位置:[系統使用者] \ .m2 \ repository
  ④ Maven核心程式如果在本地倉庫中找不到需要的外掛,那麼它會自動連線外網到中央倉庫下載。
  ⑤ 如果此時無法連線外網下載,則構建失敗。
  ⑥ 修改預設本地倉庫的位置可以讓 Maven 核心程式到我們事先準備好的目錄下查詢外掛
    (1)找到 Maven 解壓目錄 \ conf \ settings.xml
    (2)在 setting.xml 檔案中找到 localRepository 標籤
    (3)將<localRepository>/path/to/local/repo</localRepository>從註釋中取出
    (4)將標籤體內容修改為已經準備好的 Maven 倉庫路徑,如:
       <localRepository> F:Maven </localRepository>
  執行 mvn compile 命令會在 src 級目錄下生成 target 檔案(含位元組碼檔案)
  執行 mvn test-compile 命令會在 src 級目錄下生成 target 檔案(含位元組碼檔案)
  執行 mvn package命令會在 src 級目錄下生成target / *.jar 檔案,以及輔助檔案和測試報告
  執行 mvn test 命令會刪除 target 檔案(含位元組碼檔案)

09 POM
  ① 含義:Porject Object Model 專案物件模型
    DOM:Document Object Model
  ② pom.xml 對於 Maven 工程是核心配置檔案,與構建過程相關的一切設定都在這個檔案中進行配置。
    重要程度相當於 web.xml 對於動態 Web工程

10 座標
  ① 數學中的座標,平面中的X、Y標識平面中的任何一點,空間的X、Y、Z標識空間中的任何一點
  ② Maven的座標
    使用下面三個向量在倉庫中唯一定位一個 Maven工程
    (1) groupid:公司或組織名倒序 + 專案名:<groupid>com.cxj.maven</groupid>
    (2) artfactid:模組名:<artifactid>Hello</artifactid>
    (3) version:版本:<version>1.0.1</version>
  ③ Maven工程的座標與倉庫中路徑的對應關係,各自對應

11 倉庫
  ① 倉庫的分類
    (1) 本地倉庫:在當前計算機系統檔案中,為當前電腦上所有的 Maven 工程服務
    (2) 遠端倉庫:
      a 私服:搭建在區域網,為區域網範圍內的所有 Maven工程服務
      b 中央倉庫:架設在Internet 上,為全世界所有 Maven 工程服務
      c 中央倉庫映象:架設在各個大洲,為中央倉庫分擔流量,減輕中央倉庫的壓力,同時更快響應使用者的請求
  ② 倉庫中儲存的內容
    (1) Maven 自身所需的外掛
    (2) 第三方框架或工具的 jar 包,(第一方是JDK,第二方是開發人員)
    (3) 我們自己開發的 Maven 工程

12 第二個 Maven 工程(RELEASE:穩定版本,SNAPSHOT:不穩定版本)
  ① 建 Maven 工程:Hello ,HelloFriend
  ② 在 HelloFriend 工程中引用 Hello工程中的類
  ③ 在 HelloFriend 工程下的 pom.xml 檔案中新增依賴
  <dependencies>
    <dependency>
      <groupid>com.cxj.maven<groupid>
      <artifactid>Hello</artifactid>
      <version>1.0.0-SNAPSHOT</version>
      <scop>compile</scop>
    </dependency>
  </dependencies>
  ④ 進入 HelloFriend 工程的 pom.xml 目錄執行 mvn compile 開始編譯
  ⑤ 出現編譯失敗,無法解析依賴資訊。是因為 Hello 工程沒有 執行 mvn install 安裝命令
  ⑥ 因此先將 Hello 工程執行 mvn install ,再將 HelloFriend 工程執行 mvn compile 即可

13 依賴
  ① Maven 解析依賴資訊時會到本地倉庫中查詢被依賴的jar包
    對於我們自己開發的 Maven 工程,使用 install 命令安裝後就可以進入倉庫
  ② 依賴的範圍 <scop>:compile 、test、provided
    (1) compile(如:spring-core)
       是否對主程式有效:有效
       是否對測試程式有效:有效
       是否參與打包:參與
       是否參與部署:參與
    (2) test(如:junit)
       是否對主程式有效:無效
       是否對測試程式有效:有效
       是否參與打包:不參與
       是否參與部署:不參與
    (3) provided:依賴一些特定的 API(不是開發人員寫的類,如:servlet-api.jar,由伺服器提供)
       是否對主程式有效:有效
       是否對測試程式有效:有效
       是否參與打包:不參與
       是否參與部署:不參與

14 生命週期:Clean、Default、Site
  ①各個構建環節執行的順序:不能打亂順序,必須按照既定的正確順序來執行
    Default生命週期常用的階段:

validate
generate-sources
process-sources
generate-resources
process-resources  複製並處理資原始檔,至目標目錄,準備打包
compile  編譯專案的原始碼
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources  複製並處理資原始檔,至目標測試目錄
test-compile  編譯測試原始碼
process-test-classes
test  使用合適的單元測試框架執行測試,這些測試程式碼不會被打包或部署
prepare-package
package  接收編譯好的程式碼,打包成可釋出的格式,如:JAR
pre-integration-test
integration-test

  ② Maven 的核心程式中定義了抽象的生命週期,生命週期中各個階段的具體任務是由外掛來完成的。
  ③ Maven 核心程式為例更好的實現自動化構建,按照這一的特點
  ④ 外掛和目標
    (1) 生命週期的各個階段僅僅定義了要執行的任務是什麼
    (2) 各個階段和外掛的目標是對應的
    (3) 相似的目標由特定的外掛來完成
    (4)可以將目標看作"呼叫外掛功能的命令"

15 Eclipse 中設定 Maven 外掛(eclipse中內建了Maven,預設由自帶的Maven)
  ①Window->preferences->Maven->Installations->Add :指定Maven 核心程式的位置。
  ②Window->preferences->Maven->User Settings :指定 conf / settings.xml 檔案的位置,進而獲取本地倉庫的位置。
  ③ 基本操作
    (1) 建立 Maven 版的Java 工程
      a. Window->Perspective->Customize Perspective->Menu Visibility->File->New->Maven Project,將Maven Project加入到快捷鍵New中
      b. New->Maven Project->勾選 " Create a simple project (skip archetype selection)",如不勾選,則在下一步中勾選"maven-archetype-quickstart"
         輸入Group Id , Artifact Id,Version,Package(jar、war、pom),確定finish
      c. 改JDK版本,手動改:,,,,自動改:開啟settings.xml,找到profiles 標籤,加入如下配置

<profile>
  <id>jdk-1.7</id>
  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.7</jdk>
  </activation>
  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <maver.compiler.compilerVersion>1.7</maven.comiler.compilerVersion>
  </properties>
</profile>

若不能識別,則提高Maven版本即可
   (2)建立 Maven 版的JavaWeb 工程
      a. New->Maven Project->勾選 " Create a simple project (skip archetype selection)",如不勾選,則在下一步中勾選"maven-archetype-quickstart"
         輸入Group Id , Artifact Id,Version,Package(jar、war、pom),確定finish
      b. 右鍵工程-->Properties-->Project Facets-->去掉Dynamic Web Module-->Apply-->再勾選Dynamic Web Module-->
         點選"Further configuration availbale..."-->在Content directory中輸入src/main/webapp
   (3)執行 Maven 命令:run as-->再選擇響應的 Maven命令
   (4)手動建立的Maven 工程匯入Eclipse 時,需要選擇匯入Maven Project,不能以Java 工程匯入
  ④ 在 setting.xml 檔案中加入servlet-api.jar包依賴

<dependency>
  <groupid>javax<groupid>
  <artifactid>servlet-api</artifactid>
  <version>2.5</version>
  <scop>provided</scop>
</dependency>

16 依賴
  ① 依賴的傳遞性,好處:可以傳遞的依賴不必在每個模組工程中都重複宣告,在"最下面"的工程中依賴一次即可(<scop>compile</scop>,test和provided只提供給本專案使用,不能傳遞)
    若專案 A 依賴與專案 B,當在專案 B 中加入其它依賴時,專案 B 的執行環境中也會加入相應的依賴,
  ② 依賴的排除,若專案A依賴與專案 B,當在專案 B 中加入其它依賴時,若加入的依賴版本過低,則需要排除,專案A需要自己加高版本依賴,
如:在 A 的 pom.xml 檔案中寫對 B 的依賴時,同時排除專案 B 中的 commons-logging-api 包

<dependency>
  <groupid>B<groupid>
  <artifactid>B</artifactid>
  <version>B</version>
  <scop>B</scop>
  <exclusions>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
  </exclusions>
</denpendcy>

  ③ A-->B-->C,若專案 A 依賴專案 B,專案 B依賴 專案 C,當專案C 和專案B 傳遞上來兩個版本不一致的junit-api.jar時,最短路徑優先
  ④ A--B,A--C,若專案A 依賴 專案B,專案A 依賴 專案 C,當專案B 和專案 C傳遞上來兩個版本不一致的junit-api.jar時,最先宣告者優先(指dependency標籤的宣告順序)
  ⑤ 依賴的原則:解決模組工程之間的jar 包衝突問題
  ⑥ 統一管理依賴的版本:使用 properties 標籤。如:依賴的spring 包由很多同時它們的版本一致,要修改時,手動注意修改??如:

<properties>
  <atcxj.spring.version>4.0.0.RELEASE<atcxj.spring.version>  //自定義宣告的標籤:<atcxj.spring.version >,引用時:<version>&{atcxj.spring.version}</version>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  //編碼
</properties>
<dependencies>
  <dependency>
    <groupid>org.springframeword<groupid>
    <artifactid>spring-orm</artifactid>
    <version>&{atcxj.spring.version}</version>
  <dependency>
<dependency>
    <groupid>org.springframework<groupid>
    <artifactid>spring-web</artifactid>
    <version>&{atcxj.spring.version}</version>
  <dependency>
</dependencies>

  ⑦ propeties 標籤並不只能用於宣告依賴的版本號,凡是需要統一聲明後再引用的場合都可以使用。

17 繼承
  ① 現狀
    Hello依賴的junit:4.0
    HelloFriend依賴的junit:4.0
    MakeFriend依賴的junit:4.9
   由於 test 範圍的依賴不能傳遞,所以必然會分散在各個模組工程中,很容易造成版本不一致。
  ② 需求:統一管理各個模組工程中對 junit 依賴的版本
  ③ 解決思路:將junit 依賴統一提取到"父"工程中,在子工程中宣告 junit 依賴時不指定版本,以父工程中統一設定的為準,同時也便於修改。
  ④ 操作步驟
    (1) 建立一個 Maven 工程作為父工程,注意:打包方式為pom,如:父工程中pom.xml 為:

<groupid>com.cxj.maven<groupid>
<artifactid>Parent</artifactid>
<version>0.0.2-SNAPSHOT</version>
<packaging>pom</packaging>

    (2) 在子工程中宣告對父工程的引用,子工程中pom.xml 為:

<parent>  //<parent>標籤在<dependencies>標籤外部
  <groupid>com.cxj.maven<groupid>
  <artifactid>Parent</artifactid>
  <version>0.0.2-SNAPSHOT</version>
  <relativePath>../Parent/pom.xml</relativePath>  //以當前檔案為基準的父工程pom.xml 檔案的相對路徑
</parent>

    (3) 將子工程的座標中與父工程中重複的內容刪除
    (4) 在父工程中統一管理 junit 的依賴

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupid>junit</groupid>
      <artifactid>junit</artifactid>
      <version>4.0</version>
      <scop>test</scop>
    </dependency>
  </dependencies>
</dependencyManagement>

    (5) 在子工程中刪除junit 依賴的版本號部分,此時子工程中 junit 的版本就是父工程中管理的junit 版本,若不刪除則使用的就是該 junit 版本

18 聚合(一鍵安裝各個模組工程)
  ① 使用情景:當工程模組之間有依賴後,執行 mvn compile 時,需要被依賴的專案模組提前執行 mvn install
  ② 配置方式:在一個"總的聚合工程" 中配置各個參與聚合的模組

<modules>../Hello</modules>
<modules>../HelloFriend</modules>
<modules>../MakeFriends</modules>  //無先後順序

  ③ 使用方式:在聚合工程的 pom.xml 檔案上點右鍵-->run as -->maven install

19 自動部署:就是將專案打包,然後存放到 tomcat 伺服器執行,在命令列中使用 mvn deploy

<build>  //配置當前工程構建過程中的特殊設定
|  <finalName>AtCxjWeb</finalName>
|  <plugins>  //配置構建過程中需要使用的外掛
|  |  <plugin>
|  |  |  <groupId>org.codehaus.cargo</groupId>  //cargo 是一家專門 "啟動sevlet容器"的組織
|  |  |  <artifactId>cargo-maven2-pligin</artifactId>
|  |  |  <version>1.2.3</version>
|  |  |  <configurations>
|  |  |  |  <container>
|  |  |  |  |  <containerId>tomcat6x<containerId>
|  |  |  |  |  <home>D:\DevInstall\apache-tomcat-6.0.39</home>  //當前系統中容器的位置
|  |  |  |  </container>
|  |  |  |  <configuration>
|  |  |  |  |  <type>existing</type>
|  |  |  |  |  <home>D:\DevInstall\apache-tomcat-6.0.39</home>
|  |  |  |  |  <properties>
|  |  |  |  |    <cargo.servlet.port>8989</cargo-servlet-port>  //如果tomcat 埠為預設值8080則不必設定該屬性
|  |  |  |  |  </properties>
|  |  |  |  </configuration>
|  |  |  </configurations>
|  |  |  <executions>  //配置外掛在什麼情況下執行
|  |  |  |  <execution>
|  |  |  |  |  <id>cargo-run</id>
|  |  |  |  |  <phase>install</phase>  //生命週期的階段
|  |  |  |  |  <goals>
|  |  |  |  |  |  <goal>run<goal>  //生命週期的目標
|  |  |  |  |  </goals>
|  |  |  |  </execution>
|  |  |  </executions>
|  |  </plugin>
|  </plugins>
</build>

20 查詢依賴的網址:

https://mvnrepository.com