初始自動化構建工具-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