?????????????
01 自動化構建工具:Maven ???瀏覽器 ???表示層,、表述層,、表現(xiàn)層:①視圖層:H5、CSS,、JS,、JSP等 ②控制層:Servlet、Action(Struts2),、Handler(SpringMVC)等 ???業(yè)務邏輯層:Spring IOC / AOP ???持久化層:JDBC,、DBUtils、SpringTemplate,、Hibernate,、Mybatis ???數(shù)據(jù)庫:Mysql、Oracle
02 目前的技術在開發(fā)中存在的問題 ??① 一個項目就是一個工程 ??② 項目中需要的jar包必須手動"復制",、"粘貼"到 WEB-INF / lib 目錄下 ??③ jar 包需要別人替我們準備好,,或到官網(wǎng)下載 ??④ 一個 ja r包依賴的其它 jar 包需要自己手動加入到項目中,F(xiàn)ileUpload組件->IO組件
03 Maven是什么 ??① Maven一款服務于Java平臺的自動化構建工具,。 ??? Make-->Ant-->Maven-->Gradle ??② 構建 ????(1)概念:以"Java源文件",,"框架配置文件","JSP",,"HTML",,"圖片"等資源為原材料,去"生產"一個可以運行的項目的過程 ????????編譯,,部署,,搭建 ????(2)編譯:Java 源文件(User.java)->編譯->Class字節(jié)碼文件(User.class)->交給JVM去執(zhí)行 ????(3)部署:一個 BS 項目最終運行的并不是動態(tài)Web 工程本身,而是這個動態(tài) Web 工程的"編譯結果":動態(tài)Web工程->編譯,、部署->編譯結果 ??動態(tài) Web 工程目錄結構: ??工程名 ????src??源碼 ????JRE System Library??運行時環(huán)境 ????Apache Tomcat v6.0??運行時環(huán)境
????build??源碼的字節(jié)碼文件 ????WebContent??前端頁面展示 ??????META-INF ??????WEB-INF ????????lib ????????web.xml ??????index.jsp ??③構建過程中的各個環(huán)節(jié) ???(1)清理:將以前編譯得到的舊的 class 字節(jié)碼文件刪除,,為下一次編譯做準備 ???(2)編譯:將 Java 源程序編譯成 class 字節(jié)碼文件 ???(3)測試:自動測試,,自動調用 junit 程序 ???(4)報告:測試程序執(zhí)行的記過 ???(5)打包:動態(tài) Web 工程打war 包,Java工程打 jar 包 ???(6)安裝:Maven 特定的概念--將打包得到的文件復制到"倉庫"中指定位置 ???(7)部署:將動態(tài) Web 工程生成的war 復制到 Servlet 容器的指定目錄下,,使其可以運行 ??④自動化構建
04 安裝 Maven核心程序 ??① 檢查 JAVA_HOME 環(huán)境變量 ??② 解壓Maven 核心包文件,,放在一個無中文無空格的路徑下 ??③ 配置Maven 相關環(huán)境變量 ???(1)MAVEN_HOME或M2_HOME :Maven核心包解壓后的路徑 ???(2)Path:追加Maven核心包解壓后的路徑 / bin ??④ 驗證:運行 mvn -v,查看 Maven 版本
05 Maven的核心概念 ??① 約定的目錄結構 ??② POM ??③ 坐標 ??④ 依賴 ??⑤ 倉庫 ??⑥ 生命周期/插件/目標 ??⑦ 繼承 ??⑧ 聚合
06 第一個 Maven 工程 ??① 創(chuàng)建 Maven 約定的目錄結構 ??Hello??工程名 ??|??src??源碼 ??|??|??main??主程序 ??|??|??|??java??Java源文件 ??|??|??|??resources??存放框架或其它工具配置文件 ??|??|??test??測試程序 ??|??|??|??java ??|??|??|??resources ??|??pom.xm??Maven配置核心文件
??② 為什么要遵守約定的目錄結構 ????約定 > 配置 > 編碼 ??③ pom.xml 文件
07 常用Maven 命令 ??① 注意:執(zhí)行與構建過程相關的Maven的命令時,,需要進入pom.xml所在目錄 ???與構建過程相關:編譯,,測試,打包 ??② 常用命令: ???(1)mvn clean:清理 ???(2)mvn compile:編譯主程序 ???(3)mvn test-compile:編譯測試主程序 ???(4)mvn test:執(zhí)行測試 ???(5)mvn package:打包 ???(6)mvn install:安裝 ???(7)mvn site:生成站點
08 關于聯(lián)網(wǎng)問題 ??① Maven 的核心程序中僅僅定義了抽象的聲明周期,,但是具體的工作必須由特定的插件來完成,而插件本身并不包含在 Maven 的核心程序中,。 ??② 當我們指定的 Maven 命令需要用到某些插件時,Maven 核心程序會首先到本地倉庫中查找,。 ??③ 本地倉庫的默認位置:[系統(tǒng)用戶] \ .m2 \ repository ??④ Maven核心程序如果在本地倉庫中找不到需要的插件,,那么它會自動連接外網(wǎng)到中央倉庫下載。 ??⑤ 如果此時無法連接外網(wǎng)下載,,則構建失敗。 ??⑥ 修改默認本地倉庫的位置可以讓 Maven 核心程序到我們事先準備好的目錄下查找插件 ????(1)找到 Maven 解壓目錄 \ conf \ settings.xml ????(2)在 setting.xml 文件中找到 localRepository 標簽 ????(3)將<localRepository>/path/to/local/repo</localRepository>從注釋中取出 ????(4)將標簽體內容修改為已經(jīng)準備好的 Maven 倉庫路徑,,如: ???????<localRepository> F:Maven </localRepository> ??執(zhí)行 mvn compile 命令會在 src 級目錄下生成 target 文件(含字節(jié)碼文件) ??執(zhí)行 mvn test-compile 命令會在 src 級目錄下生成 target 文件(含字節(jié)碼文件) ??執(zhí)行 mvn package命令會在 src 級目錄下生成target / *.jar 文件,,以及輔助文件和測試報告 ??執(zhí)行 mvn test 命令會刪除 target 文件(含字節(jié)碼文件)
09 POM ??① 含義:Porject Object Model 項目對象模型 ????DOM:Document Object Model ??② pom.xml 對于 Maven 工程是核心配置文件,與構建過程相關的一切設置都在這個文件中進行配置,。 ????重要程度相當于 web.xml 對于動態(tài) Web工程
10 坐標 ??① 數(shù)學中的坐標,,平面中的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) 本地倉庫:在當前計算機系統(tǒng)文件中,,為當前電腦上所有的 Maven 工程服務 ????(2) 遠程倉庫: ??????a 私服:搭建在局域網(wǎng),為局域網(wǎng)范圍內的所有 Maven工程服務 ??????b 中央倉庫:架設在Internet 上,,為全世界所有 Maven 工程服務 ??????c 中央倉庫鏡像:架設在各個大洲,,為中央倉庫分擔流量,減輕中央倉庫的壓力,,同時更快響應用戶的請求 ??② 倉庫中保存的內容 ????(1) Maven 自身所需的插件 ????(2) 第三方框架或工具的 jar 包,,(第一方是JDK,第二方是開發(fā)人員) ????(3) 我們自己開發(fā)的 Maven 工程
12 第二個 Maven 工程(RELEASE:穩(wěn)定版本,,SNAPSHOT:不穩(wěn)定版本) ??① 建 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 目錄執(zhí)行 mvn compile 開始編譯 ??⑤ 出現(xiàn)編譯失敗,無法解析依賴信息,。是因為 Hello 工程沒有 執(zhí)行 mvn install 安裝命令 ??⑥ 因此先將 Hello 工程執(zhí)行 mvn install ,,再將 HelloFriend 工程執(zhí)行 mvn compile 即可
13 依賴 ??① Maven 解析依賴信息時會到本地倉庫中查找被依賴的jar包 ????對于我們自己開發(fā)的 Maven 工程,,使用 install 命令安裝后就可以進入倉庫 ??② 依賴的范圍 <scop>:compile 、test,、provided ????(1) compile(如:spring-core) ???????是否對主程序有效:有效 ???????是否對測試程序有效:有效 ???????是否參與打包:參與 ???????是否參與部署:參與 ????(2) test(如:junit) ???????是否對主程序有效:無效 ???????是否對測試程序有效:有效 ???????是否參與打包:不參與 ???????是否參與部署:不參與 ????(3) provided:依賴一些特定的 API(不是開發(fā)人員寫的類,,如:servlet-api.jar,由服務器提供) ???????是否對主程序有效:有效 ???????是否對測試程序有效:有效 ???????是否參與打包:不參與 ???????是否參與部署:不參與
14 生命周期:Clean,、Default,、Site ??①各個構建環(huán)節(jié)執(zhí)行的順序:不能打亂順序,必須按照既定的正確順序來執(zhí)行 ????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??接收編譯好的代碼,,打包成可發(fā)布的格式,如:JAR
pre-integration-test
integration-test
??② Maven 的核心程序中定義了抽象的生命周期,,生命周期中各個階段的具體任務是由插件來完成的,。 ??③ Maven 核心程序為例更好的實現(xiàn)自動化構建,按照這一的特點 ??④ 插件和目標 ????(1) 生命周期的各個階段僅僅定義了要執(zhí)行的任務是什么 ????(2) 各個階段和插件的目標是對應的 ????(3) 相似的目標由特定的插件來完成 ??? (4)可以將目標看作"調用插件功能的命令"
15 Eclipse 中設置 Maven 插件(eclipse中內置了Maven,,默認由自帶的Maven) ??①Window->preferences->Maven->Installations->Add :指定Maven 核心程序的位置,。 ??②Window->preferences->Maven->User Settings :指定 conf / settings.xml 文件的位置,進而獲取本地倉庫的位置,。 ??③ 基本操作 ????(1) 創(chuàng)建 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)創(chuàng)建 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)執(zhí)行 Maven 命令:run as-->再選擇響應的 Maven命令 ???(4)手動創(chuàng)建的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 的運行環(huán)境中也會加入相應的依賴,, ??② 依賴的排除,,若項目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時,,最短路徑優(yōu)先 ??④ A--B,,A--C,若項目A 依賴 項目B,,項目A 依賴 項目 C,,當項目B 和項目 C傳遞上來兩個版本不一致的junit-api.jar時,最先聲明者優(yōu)先(指dependency標簽的聲明順序) ??⑤ 依賴的原則:解決模塊工程之間的jar 包沖突問題 ??⑥ 統(tǒng)一管理依賴的版本:使用 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 標簽并不只能用于聲明依賴的版本號,,凡是需要統(tǒng)一聲明后再引用的場合都可以使用,。
17 繼承 ??① 現(xiàn)狀 ????Hello依賴的junit:4.0 ????HelloFriend依賴的junit:4.0 ????MakeFriend依賴的junit:4.9 ???由于 test 范圍的依賴不能傳遞,,所以必然會分散在各個模塊工程中,很容易造成版本不一致,。 ??② 需求:統(tǒng)一管理各個模塊工程中對 junit 依賴的版本 ??③ 解決思路:將junit 依賴統(tǒng)一提取到"父"工程中,,在子工程中聲明 junit 依賴時不指定版本,以父工程中統(tǒng)一設定的為準,,同時也便于修改,。 ??④ 操作步驟 ????(1) 創(chuàng)建一個 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) 在父工程中統(tǒng)一管理 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 聚合(一鍵安裝各個模塊工程) ??① 使用情景:當工程模塊之間有依賴后,,執(zhí)行 mvn compile 時,需要被依賴的項目模塊提前執(zhí)行 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>??//當前系統(tǒng)中容器的位置
|??|??|??|??</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>??//配置插件在什么情況下執(zhí)行
|??|??|??|??<execution>
|??|??|??|??|??<id>cargo-run</id>
|??|??|??|??|??<phase>install</phase>??//生命周期的階段
|??|??|??|??|??<goals>
|??|??|??|??|??|??<goal>run<goal>??//生命周期的目標
|??|??|??|??|??</goals>
|??|??|??|??</execution>
|??|??|??</executions>
|??|??</plugin>
|??</plugins>
</build>
20 查找依賴的網(wǎng)址:
https://mvnrepository.com
|