?????????????
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/230965.html
標籤:其他
上一篇:初始自動化構建工具-Maven
