柚子快報(bào)激活碼778899分享:java Maven 總結(jié)
柚子快報(bào)激活碼778899分享:java Maven 總結(jié)
文章目錄
第一章 Maven概述第一節(jié) 為什么要學(xué)習(xí)Maven?1、從『構(gòu)建』角度解釋①個(gè)人開發(fā)流程②團(tuán)隊(duì)開發(fā)流程
2、從『依賴』角度解釋①jar包的規(guī)模②jar包的來(lái)源③jar包之間的依賴關(guān)系
第二節(jié) What?什么是Maven?第二節(jié) 什么是Maven?1、構(gòu)建……
2、依賴3、Maven的工作機(jī)制
第二章 Maven核心程序解壓和配置第一節(jié) Maven核心程序解壓與配置1、解壓Maven核心程序2、指定本地倉(cāng)庫(kù)3、配置阿里云提供的鏡像倉(cāng)庫(kù)4、配置Maven工程的基礎(chǔ)JDK版本
第二節(jié) 配置環(huán)境變量1、檢查JAVA_HOME配置是否正確2、配置MAVEN_HOME3、配置PATH4、驗(yàn)證
第三章 使用Maven:命令行環(huán)境第一節(jié) 實(shí)驗(yàn)一:根據(jù)坐標(biāo)創(chuàng)建Maven工程1、Maven核心概念:坐標(biāo)①數(shù)學(xué)中的坐標(biāo)②Maven中的坐標(biāo)[1]向量說(shuō)明[2]三個(gè)向量的取值方式
③坐標(biāo)和倉(cāng)庫(kù)中jar包的存儲(chǔ)路徑之間的對(duì)應(yīng)關(guān)系
2、實(shí)驗(yàn)操作①創(chuàng)建目錄作為后面操作的工作空間②在工作空間目錄下打開命令行窗口③使用命令生成Maven工程④調(diào)整
3、Maven核心概念:POM①含義②思想③對(duì)應(yīng)的配置文件
4、Maven核心概念:約定的目錄結(jié)構(gòu)①各個(gè)目錄的作用②約定目錄結(jié)構(gòu)的意義③約定大于配置
第二節(jié) 實(shí)驗(yàn)二:在Maven工程中編寫代碼1、主體程序①自動(dòng)生成的pom.xml解讀②編寫主體程序
2、測(cè)試程序
第三節(jié) 實(shí)驗(yàn)三:執(zhí)行Maven的構(gòu)建命令1、要求2、清理操作3、編譯操作4、測(cè)試操作5、打包操作6、安裝操作
第四節(jié) 實(shí)驗(yàn)四:創(chuàng)建Maven版的Web工程1、說(shuō)明2、操作3、生成的pom.xml4、生成的Web工程的目錄結(jié)構(gòu)5、創(chuàng)建Servlet①在main目錄下創(chuàng)建java目錄②在java目錄下創(chuàng)建Servlet類所在的包的目錄③在包下創(chuàng)建Servlet類④在web.xml中注冊(cè)Servlet
6、在index.jsp頁(yè)面編寫超鏈接7、編譯8、配置對(duì)servlet-api.jar包的依賴9、將Web工程打包為war包10、將war包部署到Tomcat上運(yùn)行
第五節(jié) 實(shí)驗(yàn)五:讓W(xué)eb工程依賴Java工程1、觀念2、操作3、在Web工程中,編寫測(cè)試代碼①補(bǔ)充創(chuàng)建目錄②確認(rèn)Web工程依賴了junit③創(chuàng)建測(cè)試類
4、執(zhí)行Maven命令①測(cè)試命令②打包命令③查看當(dāng)前Web工程所依賴的jar包的列表④以樹形結(jié)構(gòu)查看當(dāng)前Web工程的依賴信息
第六節(jié) 實(shí)驗(yàn)六:測(cè)試依賴范圍1、依賴范圍①compile和test對(duì)比②compile和provided對(duì)比③結(jié)論
2、測(cè)試①驗(yàn)證test范圍對(duì)main目錄無(wú)效②驗(yàn)證test和provided范圍不參與服務(wù)器部署③驗(yàn)證provided范圍對(duì)測(cè)試程序有效
第七節(jié) 實(shí)驗(yàn)七:測(cè)試依賴的傳遞性1、依賴的傳遞性①概念②傳遞的原則
2、使用compile范圍依賴spring-core3、驗(yàn)證test和provided范圍不能傳遞
第八節(jié) 實(shí)驗(yàn)八:測(cè)試依賴的排除1、概念2、配置方式3、測(cè)試
第九節(jié) 實(shí)驗(yàn)九:繼承1、概念2、作用3、舉例4、操作①創(chuàng)建父工程②創(chuàng)建模塊工程③查看被添加新內(nèi)容的父工程pom.xml④解讀子工程的pom.xml⑤在父工程中配置依賴的統(tǒng)一管理⑥子工程中引用那些被父工程管理的依賴⑦在父工程中升級(jí)依賴信息的版本⑧在父工程中聲明自定義屬性
5、實(shí)際意義
第十節(jié) 實(shí)驗(yàn)十:聚合1、聚合本身的含義2、Maven中的聚合3、好處4、聚合的配置5、依賴循環(huán)問(wèn)題
第四章 使用Maven:IDEA環(huán)境第一節(jié) 創(chuàng)建父工程第二節(jié) 配置Maven信息第三節(jié) 創(chuàng)建模塊工程第四節(jié) 創(chuàng)建Web工程1、創(chuàng)建模塊2、修改打包方式3、增加目錄4、借助IDEA生成web.xml
第五節(jié) 其他操作1、在IDEA中執(zhí)行Maven命令2、在IDEA中查看某個(gè)模塊的依賴信息
第五章 jar包下載失敗問(wèn)題的解決方案第一節(jié) 提出問(wèn)題第二節(jié) Maven正常下載的做法第三節(jié) 下載失敗的第一種情況1、Maven的行為描述2、解決辦法3、要求Maven重新下載jar包
第四節(jié) 下載失敗的第二種情況1、文件校驗(yàn)工具2、用法3、原理4、找到有嫌疑的jar包5、為什么不建議刪整個(gè)庫(kù)
第一章 Maven概述
第一節(jié) 為什么要學(xué)習(xí)Maven?
1、從『構(gòu)建』角度解釋
①個(gè)人開發(fā)流程
②團(tuán)隊(duì)開發(fā)流程
引申:更大范圍內(nèi)的團(tuán)隊(duì)協(xié)作
2、從『依賴』角度解釋
①jar包的規(guī)模
隨著我們使用越來(lái)越多的框架,或者框架封裝程度越來(lái)越高,項(xiàng)目中使用的jar包也越來(lái)越多。項(xiàng)目中,一個(gè)模塊里面用到上百個(gè)jar包是非常正常的。
②jar包的來(lái)源
這個(gè)jar包所屬技術(shù)的官網(wǎng)。官網(wǎng)通常是英文界面,網(wǎng)站的結(jié)構(gòu)又不盡相同,甚至找到下載鏈接還發(fā)現(xiàn)需要通過(guò)特殊的工具下載。 第三方網(wǎng)站提供下載。問(wèn)題是不規(guī)范,在使用過(guò)程中會(huì)出現(xiàn)各種問(wèn)題。
jar包的名稱jar包的版本jar包內(nèi)的具體細(xì)節(jié)
③jar包之間的依賴關(guān)系
框架中使用的jar包,不僅數(shù)量龐大,而且彼此之間存在錯(cuò)綜復(fù)雜的依賴關(guān)系。依賴關(guān)系的復(fù)雜程度,已經(jīng)上升到了完全不能靠人力手動(dòng)解決的程度。另外,jar包之間有可能產(chǎn)生沖突。進(jìn)一步增加了我們?cè)趈ar包使用過(guò)程中的難度。
到目前為止,我們熟悉的jar包之間依賴關(guān)系有下面這些例子:
junit-4.12依賴hamcrest-core-1.3thymeleaf-3.0.12.RELEASE依賴ognl-3.1.26
ognl-3.1.26依賴javassist-3.20.0-GA thymeleaf-3.0.12.RELEASE依賴attoparser-2.0.5.RELEASEthymeleaf-3.0.12.RELEASE依賴unbescape-1.1.6.RELEASEthymeleaf-3.0.12.RELEASE依賴slf4j-api-1.7.26
而實(shí)際上jar包之間的依賴關(guān)系是普遍存在的,如果要由程序員手動(dòng)梳理無(wú)疑會(huì)增加極高的學(xué)習(xí)成本,而這些工作又對(duì)實(shí)現(xiàn)業(yè)務(wù)功能毫無(wú)幫助。
第二節(jié) What?什么是Maven?
第二節(jié) 什么是Maven?
Maven是Apache軟件基金會(huì)組織維護(hù)的一款專門為Java項(xiàng)目提供構(gòu)建和依賴管理支持的工具。
1、構(gòu)建
Java項(xiàng)目開發(fā)過(guò)程中,構(gòu)建指的是使用『原材料生產(chǎn)產(chǎn)品』的過(guò)程。
原材料
Java源代碼 基于HTML的Thymeleaf文件 圖片 配置文件 …… 產(chǎn)品
一個(gè)可以在服務(wù)器上運(yùn)行的項(xiàng)目
構(gòu)建過(guò)程包含的主要的環(huán)節(jié):
清理:刪除上一次構(gòu)建的結(jié)果,為下一次構(gòu)建做好準(zhǔn)備編譯:Java源程序編譯成*.class字節(jié)碼文件測(cè)試:運(yùn)行提前準(zhǔn)備好的測(cè)試程序報(bào)告:針對(duì)剛才測(cè)試的結(jié)果生成一個(gè)全面的信息打包
Java工程:jar包Web工程:war包 安裝:把一個(gè)Maven工程安裝到Maven倉(cāng)庫(kù)部署:將準(zhǔn)備好的jar包或war包部署到服務(wù)器上運(yùn)行
2、依賴
如果A工程里面用到了B工程的類、接口、配置文件等等這樣的資源,那么我們就可以說(shuō)A依賴B。例如:
junit-4.12依賴hamcrest-core-1.3thymeleaf-3.0.12.RELEASE依賴ognl-3.1.26
ognl-3.1.26依賴javassist-3.20.0-GA thymeleaf-3.0.12.RELEASE依賴attoparser-2.0.5.RELEASEthymeleaf-3.0.12.RELEASE依賴unbescape-1.1.6.RELEASEthymeleaf-3.0.12.RELEASE依賴slf4j-api-1.7.26
依賴管理中要解決的具體問(wèn)題:
jar包的下載:使用Maven之后,jar包會(huì)從規(guī)范的遠(yuǎn)程倉(cāng)庫(kù)下載到本地jar包之間的依賴:通過(guò)依賴的傳遞性自動(dòng)完成jar包之間的沖突:通過(guò)對(duì)依賴的配置進(jìn)行調(diào)整,讓某些jar包不會(huì)被導(dǎo)入
3、Maven的工作機(jī)制
第二章 Maven核心程序解壓和配置
第一節(jié) Maven核心程序解壓與配置
1、解壓Maven核心程序
核心程序壓縮包:apache-maven-3.5.4-bin.zip,解壓到非中文、沒(méi)有空格的目錄。例如:
在解壓目錄中,我們需要著重關(guān)注Maven的核心配置文件:conf/settings.xml
2、指定本地倉(cāng)庫(kù)
本地倉(cāng)庫(kù)默認(rèn)值:用戶家目錄/.m2/repository。由于本地倉(cāng)庫(kù)的默認(rèn)位置是在用戶的家目錄下,而家目錄往往是在C盤,也就是系統(tǒng)盤。將來(lái)Maven倉(cāng)庫(kù)中jar包越來(lái)越多,倉(cāng)庫(kù)體積越來(lái)越大,可能會(huì)拖慢C盤運(yùn)行速度,影響系統(tǒng)性能。所以建議將Maven的本地倉(cāng)庫(kù)放在其他盤符下。配置方式如下:
本地倉(cāng)庫(kù)這個(gè)目錄,我們手動(dòng)創(chuàng)建一個(gè)空的目錄即可。
記?。阂欢ㄒ裭ocalRepository標(biāo)簽從注釋中拿出來(lái)。
注意:本地倉(cāng)庫(kù)本身也需要使用一個(gè)非中文、沒(méi)有空格的目錄。
3、配置阿里云提供的鏡像倉(cāng)庫(kù)
Maven下載jar包默認(rèn)訪問(wèn)境外的中央倉(cāng)庫(kù),速度很慢。改成阿里云提供的鏡像倉(cāng)庫(kù),訪問(wèn)國(guó)內(nèi)網(wǎng)站,可以讓Maven下載jar包的時(shí)候速度更快。配置的方式是:將下面mirror標(biāo)簽整體復(fù)制到mirrors標(biāo)簽的內(nèi)部。
4、配置Maven工程的基礎(chǔ)JDK版本
如果按照默認(rèn)配置運(yùn)行,Java工程使用的JDK版本是1.5。配置的方式是:將profile標(biāo)簽整個(gè)復(fù)制到profiles標(biāo)簽內(nèi)。
第二節(jié) 配置環(huán)境變量
1、檢查JAVA_HOME配置是否正確
Maven是一個(gè)用Java語(yǔ)言開發(fā)的程序,它必須基于JDK來(lái)運(yùn)行,需要通過(guò)JAVA_HOME來(lái)找到JDK的安裝位置。
可以使用下面的命令驗(yàn)證:
C:\Users\Administrator>echo %JAVA_HOME%
D:\software\Java
C:\Users\Administrator>java -version
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
2、配置MAVEN_HOME
配置環(huán)境變量的規(guī)律:
XXX_HOME指向的是bin目錄的上一級(jí)
PATH指向的是bin目錄
3、配置PATH
4、驗(yàn)證
C:\Users\Administrator>mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: D:\software\apache-maven-3.5.4\bin\..
Java version: 1.8.0_141, vendor: Oracle Corporation, runtime: D:\software\Java\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
第三章 使用Maven:命令行環(huán)境
第一節(jié) 實(shí)驗(yàn)一:根據(jù)坐標(biāo)創(chuàng)建Maven工程
學(xué)習(xí)命令行操作作為將來(lái)在IDEA中使用圖形化界面操作的過(guò)渡。使用命令行可以不受IDEA這樣的環(huán)境的干擾,這樣就有一個(gè)純凈的測(cè)試Maven功能的環(huán)境。我們的目標(biāo)是通過(guò)命令學(xué)習(xí)Maven的功能和用法。
1、Maven核心概念:坐標(biāo)
①數(shù)學(xué)中的坐標(biāo)
使用x、y、z三個(gè)“向量”作為空間的坐標(biāo)系,可以在空間中唯一的定位到一個(gè)點(diǎn)。
②Maven中的坐標(biāo)
[1]向量說(shuō)明
使用三個(gè)向量在Maven的倉(cāng)庫(kù)中唯一的定位到一個(gè)jar包。
groupId:公司或組織的idartifactId:一個(gè)項(xiàng)目或者是項(xiàng)目中的一個(gè)模塊的idversion:版本號(hào)
[2]三個(gè)向量的取值方式
groupId:公司或組織域名的倒序,通常也會(huì)加上項(xiàng)目名稱
例如:com.atguigu.maven artifactId:模塊的名稱,將來(lái)作為Maven工程的工程名version:模塊的版本號(hào),根據(jù)自己的需要設(shè)定
例如:SNAPSHOT表示快照版本,正在迭代過(guò)程中,不穩(wěn)定的版本例如:RELEASE表示正式版本
舉例:
groupId:com.atguigu.mavenartifactId:pro01-atguigu-mavenversion:1.0-SNAPSHOT
③坐標(biāo)和倉(cāng)庫(kù)中jar包的存儲(chǔ)路徑之間的對(duì)應(yīng)關(guān)系
坐標(biāo):
上面坐標(biāo)對(duì)應(yīng)的jar包在Maven本地倉(cāng)庫(kù)中的位置:
Maven本地倉(cāng)庫(kù)根目錄\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar
一定要學(xué)會(huì)根據(jù)坐標(biāo)到本地倉(cāng)庫(kù)中找到對(duì)應(yīng)的jar包。
2、實(shí)驗(yàn)操作
①創(chuàng)建目錄作為后面操作的工作空間
例如:D:\maven-workspace\space210323
②在工作空間目錄下打開命令行窗口
③使用命令生成Maven工程
運(yùn)行mvn archetype:generate命令
下面根據(jù)提示操作
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:【直接回車,使用默認(rèn)值】
Define value for property ‘groupId’: com.atguigu.maven
Define value for property ‘a(chǎn)rtifactId’: pro01-maven-java
Define value for property ‘version’ 1.0-SNAPSHOT: :【直接回車,使用默認(rèn)值】
Define value for property ‘package’ com.atguigu.maven: :【直接回車,使用默認(rèn)值】
Confirm properties configuration: groupId: com.atguigu.maven artifactId: pro01-maven-java version: 1.0-SNAPSHOT package: com.atguigu.maven Y: :【直接回車,表示確認(rèn)】
④調(diào)整
Maven默認(rèn)生成的工程,對(duì)junit依賴的是較低的3.8.1版本,我們可以改成4.12版本。
自動(dòng)生成的App.java和AppTest.java可以刪除。
3、Maven核心概念:POM
①含義
POM:Project Object Model,項(xiàng)目對(duì)象模型。和POM類似的是:DOM:Document Object Model,文檔對(duì)象模型。
②思想
POM表示將工程抽象為一個(gè)模型,再用程序中的對(duì)象來(lái)描述這個(gè)模型。這樣我們就可以用程序來(lái)管理項(xiàng)目了。我們?cè)陂_發(fā)過(guò)程中,最基本的做法就是將現(xiàn)實(shí)生活中的事物抽象為模型,然后封裝模型相關(guān)的數(shù)據(jù)作為一個(gè)對(duì)象,這樣就可以在程序中計(jì)算與現(xiàn)實(shí)事物相關(guān)的數(shù)據(jù)。
③對(duì)應(yīng)的配置文件
POM理念集中體現(xiàn)在Maven工程根目錄下pom.xml這個(gè)配置文件中。所以這個(gè)pom.xml配置文件就是Maven工程的核心配置文件。其實(shí)學(xué)習(xí)Maven就是學(xué)這個(gè)文件怎么配置,各個(gè)配置有什么用。
4、Maven核心概念:約定的目錄結(jié)構(gòu)
①各個(gè)目錄的作用
另外還有一個(gè)target目錄專門存放構(gòu)建操作輸出的結(jié)果。
②約定目錄結(jié)構(gòu)的意義
Maven為了讓構(gòu)建過(guò)程能夠盡可能自動(dòng)化完成,所以必須約定目錄結(jié)構(gòu)的作用。例如:Maven執(zhí)行編譯操作,必須先去Java源程序目錄讀取Java源代碼,然后執(zhí)行編譯,最后把編譯結(jié)果存放在target目錄。
③約定大于配置
Maven對(duì)于目錄結(jié)構(gòu)這個(gè)問(wèn)題,沒(méi)有采用配置的方式,而是基于約定。這樣會(huì)讓我們?cè)陂_發(fā)過(guò)程中非常方便。如果每次創(chuàng)建Maven工程后,還需要針對(duì)各個(gè)目錄的位置進(jìn)行詳細(xì)的配置,那肯定非常麻煩。
目前開發(fā)領(lǐng)域的技術(shù)發(fā)展趨勢(shì)就是:約定大于配置,配置大于編碼。
第二節(jié) 實(shí)驗(yàn)二:在Maven工程中編寫代碼
1、主體程序
①自動(dòng)生成的pom.xml解讀
②編寫主體程序
主體程序指的是被測(cè)試的程序,同時(shí)也是將來(lái)在項(xiàng)目中真正要使用的程序。
package com.atguigu.maven;
public class Calculator {
public int sum(int i, int j){
return i + j;
}
}
2、測(cè)試程序
package com.atguigu.maven;
import org.junit.Test;
import com.atguigu.maven.Calculator;
// 靜態(tài)導(dǎo)入的效果是將Assert類中的靜態(tài)資源導(dǎo)入當(dāng)前類
// 這樣一來(lái),在當(dāng)前類中就可以直接使用Assert類中的靜態(tài)資源,不需要寫類名
import static org.junit.Assert.*;
public class CalculatorTest{
@Test
public void testSum(){
// 1.創(chuàng)建Calculator對(duì)象
Calculator calculator = new Calculator();
// 2.調(diào)用Calculator對(duì)象的方法,獲取到程序運(yùn)行實(shí)際的結(jié)果
int actualResult = calculator.sum(5, 3);
// 3.聲明一個(gè)變量,表示程序運(yùn)行期待的結(jié)果
int expectedResult = 8;
// 4.使用斷言來(lái)判斷實(shí)際結(jié)果和期待結(jié)果是否一致
// 如果一致:測(cè)試通過(guò),不會(huì)拋出異常
// 如果不一致:拋出異常,測(cè)試失敗
assertEquals(expectedResult, actualResult);
}
}
第三節(jié) 實(shí)驗(yàn)三:執(zhí)行Maven的構(gòu)建命令
1、要求
運(yùn)行Maven中和構(gòu)建操作相關(guān)的命令時(shí),必須進(jìn)入到pom.xml所在的目錄。如果沒(méi)有在pom.xml所在的目錄運(yùn)行Maven的構(gòu)建命令,那么會(huì)看到下面的錯(cuò)誤信息:
The goal you specified requires a project to execute but there is no POM in this directory
mvn -v命令和構(gòu)建操作無(wú)關(guān),只要正確配置了PATH,在任何目錄下執(zhí)行都可以。
2、清理操作
mvn clean
效果:刪除target目錄
3、編譯操作
主程序編譯:mvn compile
測(cè)試程序編譯:mvn test-compile
主體程序編譯結(jié)果存放的目錄:target/classes
測(cè)試程序編譯結(jié)果存放的目錄:target/test-classes
4、測(cè)試操作
mvn test
測(cè)試的報(bào)告會(huì)存放在target/surefire-reports目錄下
5、打包操作
mvn package
打包的結(jié)果會(huì)存放在target目錄下
6、安裝操作
mvn install
[INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\target\pro01-maven-java-1.0-SNAPSHOT.jar to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
[INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\pom.xml to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.pom
安裝的效果是將本地構(gòu)建過(guò)程中生成的jar包存入Maven本地倉(cāng)庫(kù)。這個(gè)jar包在Maven倉(cāng)庫(kù)中的路徑是根據(jù)它的坐標(biāo)生成的。
坐標(biāo)信息如下:
在Maven倉(cāng)庫(kù)中生成的路徑如下:
D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
另外,安裝操作還會(huì)將pom.xml文件轉(zhuǎn)換為XXX.pom文件一起存入本地倉(cāng)庫(kù)。所以我們?cè)贛aven的本地倉(cāng)庫(kù)中想看一個(gè)jar包原始的pom.xml文件時(shí),查看對(duì)應(yīng)XXX.pom文件即可,它們是名字發(fā)生了改變,本質(zhì)上是同一個(gè)文件。
第四節(jié) 實(shí)驗(yàn)四:創(chuàng)建Maven版的Web工程
1、說(shuō)明
使用mvn archetype:generate命令生成Web工程時(shí),需要使用一個(gè)專門的archetype。這個(gè)專門生成Web工程骨架的archetype可以參照官網(wǎng)看到它的用法:
參數(shù)archetypeGroupId、archetypeArtifactId、archetypeVersion用來(lái)指定現(xiàn)在使用的maven-archetype-webapp的坐標(biāo)。
2、操作
注意:如果在上一個(gè)工程的目錄下執(zhí)行mvn archetype:generate命令,那么Maven會(huì)報(bào)錯(cuò):不能在一個(gè)非pom的工程下再創(chuàng)建其他工程。所以不要再剛才創(chuàng)建的工程里再創(chuàng)建新的工程,請(qǐng)回到工作空間根目錄來(lái)操作。
然后運(yùn)行生成工程的命令:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
下面的操作按照提示執(zhí)行:
Define value for property ‘groupId’: com.atguigu.maven Define value for property ‘a(chǎn)rtifactId’: pro02-maven-web Define value for property ‘version’ 1.0-SNAPSHOT: :【直接回車,使用默認(rèn)值】
Define value for property ‘package’ com.atguigu.maven: :【直接回車,使用默認(rèn)值】 Confirm properties configuration: groupId: com.atguigu.maven artifactId: pro02-maven-web version: 1.0-SNAPSHOT package: com.atguigu.maven Y: :【直接回車,表示確認(rèn)】
3、生成的pom.xml
確認(rèn)打包的方式是war包形式
4、生成的Web工程的目錄結(jié)構(gòu)
webapp目錄下有index.jsp
WEB-INF目錄下有web.xml
5、創(chuàng)建Servlet
①在main目錄下創(chuàng)建java目錄
②在java目錄下創(chuàng)建Servlet類所在的包的目錄
③在包下創(chuàng)建Servlet類
package com.atguigu.maven;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
public class HelloServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello maven web");
}
}
④在web.xml中注冊(cè)Servlet
6、在index.jsp頁(yè)面編寫超鏈接
Hello World!
JSP全稱是Java Server Page,和Thymeleaf一樣,是服務(wù)器端頁(yè)面渲染技術(shù)。這里我們不必關(guān)心JSP語(yǔ)法細(xì)節(jié),編寫一個(gè)簡(jiǎn)單的超鏈接HTML標(biāo)簽即可。
7、編譯
執(zhí)行mvn compile命令出錯(cuò):
程序包javax.servlet.http不存在
程序包javax.servlet不存在
找不到符號(hào)
符號(hào): 類 HttpServlet
……
上面的錯(cuò)誤信息說(shuō)明:我們的Web工程用到了HttpServlet這個(gè)類,而HttpServlet這個(gè)類屬于servlet-api.jar這個(gè)jar包。此時(shí)我們說(shuō),Web工程需要依賴servlet-api.jar包。
8、配置對(duì)servlet-api.jar包的依賴
對(duì)于不知道詳細(xì)信息的依賴可以到https://mvnrepository.com/網(wǎng)站查詢。使用關(guān)鍵詞搜索,然后在搜索結(jié)果列表中選擇適合的使用。
比如,我們找到的servlet-api的依賴信息:
這樣就可以把上面的信息加入pom.xml。重新執(zhí)行mvn compile命令。
9、將Web工程打包為war包
運(yùn)行mvn package命令,生成war包的位置如下圖所示:
10、將war包部署到Tomcat上運(yùn)行
將war包復(fù)制到Tomcat/webapps目錄下
啟動(dòng)Tomcat:
通過(guò)瀏覽器嘗試訪問(wèn):http://localhost:8080/pro02-maven-web/index.jsp
第五節(jié) 實(shí)驗(yàn)五:讓W(xué)eb工程依賴Java工程
1、觀念
明確一個(gè)意識(shí):從來(lái)只有Web工程依賴Java工程,沒(méi)有反過(guò)來(lái)Java工程依賴Web工程。本質(zhì)上來(lái)說(shuō),Web工程依賴的Java工程其實(shí)就是Web工程里導(dǎo)入的jar包。最終Java工程會(huì)變成jar包,放在Web工程的WEB-INF/lib目錄下。
2、操作
在pro02-maven-web工程的pom.xml中,找到dependencies標(biāo)簽,在dependencies標(biāo)簽中做如下配置:
3、在Web工程中,編寫測(cè)試代碼
①補(bǔ)充創(chuàng)建目錄
pro02-maven-wb\src\test\java\com\atguigu\maven
②確認(rèn)Web工程依賴了junit
③創(chuàng)建測(cè)試類
把Java工程的CalculatorTest.java類復(fù)制到pro02-maven-wb\src\test\java\com\atguigu\maven目錄下
4、執(zhí)行Maven命令
①測(cè)試命令
mvn test
說(shuō)明:測(cè)試操作中會(huì)提前自動(dòng)執(zhí)行編譯操作,測(cè)試成功就說(shuō)明編譯也是成功的。
②打包命令
mvn package
通過(guò)查看war包內(nèi)的結(jié)構(gòu),我們看到被Web工程依賴的Java工程確實(shí)是會(huì)變成Web工程的WEB-INF/lib目錄下的jar包。
③查看當(dāng)前Web工程所依賴的jar包的列表
mvn dependency:list
[INFO] The following files have been resolved: [INFO] org.hamcrest:hamcrest-core:jar:1.3:test [INFO] javax.servlet:javax.servlet-api:jar:3.1.0:provided [INFO] com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile [INFO] junit:junit:jar:4.12:test
說(shuō)明:javax.servlet:javax.servlet-api:jar:3.1.0:provided格式顯示的是一個(gè)jar包的坐標(biāo)信息。格式是:
groupId:artifactId:打包方式:version:依賴的范圍
這樣的格式雖然和我們XML配置文件中坐標(biāo)的格式不同,但是本質(zhì)上還是坐標(biāo)信息,大家需要能夠認(rèn)識(shí)這樣的格式,將來(lái)從Maven命令的日志或錯(cuò)誤信息中看到這樣格式的信息,就能夠識(shí)別出來(lái)這是坐標(biāo)。進(jìn)而根據(jù)坐標(biāo)到Maven倉(cāng)庫(kù)找到對(duì)應(yīng)的jar包,用這樣的方式解決我們遇到的報(bào)錯(cuò)的情況。
④以樹形結(jié)構(gòu)查看當(dāng)前Web工程的依賴信息
mvn dependency:tree
[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT [INFO] ± junit:junit:jar:4.12:test [INFO] | - org.hamcrest:hamcrest-core:jar:1.3:test [INFO] ± javax.servlet:javax.servlet-api:jar:3.1.0:provided [INFO] - com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
我們?cè)趐om.xml中并沒(méi)有依賴hamcrest-core,但是它卻被加入了我們依賴的列表。原因是:junit依賴了hamcrest-core,然后基于依賴的傳遞性,hamcrest-core被傳遞到我們的工程了。
第六節(jié) 實(shí)驗(yàn)六:測(cè)試依賴范圍
1、依賴范圍
標(biāo)簽的位置:dependencies/dependency/scope
標(biāo)簽的可選值:compile/test/provided
①compile和test對(duì)比
main目錄(空間)test目錄(空間)開發(fā)過(guò)程(時(shí)間)部署到服務(wù)器(時(shí)間)compile有效有效有效有效test無(wú)效有效有效無(wú)效
②compile和provided對(duì)比
main目錄(空間)test目錄(空間)開發(fā)過(guò)程(時(shí)間)部署到服務(wù)器(時(shí)間)compile有效有效有效有效provided有效有效有效無(wú)效
③結(jié)論
compile:通常使用的第三方框架的jar包這樣在項(xiàng)目實(shí)際運(yùn)行時(shí)真正要用到的jar包都是以compile范圍進(jìn)行依賴的。比如SSM框架所需jar包。
test:測(cè)試過(guò)程中使用的jar包,以test范圍依賴進(jìn)來(lái)。比如junit。
provided:在開發(fā)過(guò)程中需要用到的“服務(wù)器上的jar包”通常以provided范圍依賴進(jìn)來(lái)。比如servlet-api、jsp-api。而這個(gè)范圍的jar包之所以不參與部署、不放進(jìn)war包,就是避免和服務(wù)器上已有的同類jar包產(chǎn)生沖突,同時(shí)減輕服務(wù)器的負(fù)擔(dān)。說(shuō)白了就是:“服務(wù)器上已經(jīng)有了,你就別帶啦!”
2、測(cè)試
①驗(yàn)證test范圍對(duì)main目錄無(wú)效
測(cè)試方式:在主體程序中導(dǎo)入org.junit.Test這個(gè)注解,然后執(zhí)行編譯。
具體操作:在pro01-maven-java\src\main\java\com\atguigu\maven目錄下修改Calculator.java
package com.atguigu.maven;
import org.junit.Test;
public class Calculator {
public int sum(int i, int j){
return i + j;
}
}
執(zhí)行Maven編譯命令:
[ERROR] /D:/maven-workspace/space201026/pro01-maven-java/src/main/java/com/atguigu/maven/Calculator.java:[3,17] 程序包org.junit不存在
②驗(yàn)證test和provided范圍不參與服務(wù)器部署
其實(shí)就是驗(yàn)證:通過(guò)compile范圍依賴的jar包會(huì)放入war包,通過(guò)test范圍依賴的jar包不會(huì)放入war包。
③驗(yàn)證provided范圍對(duì)測(cè)試程序有效
測(cè)試方式是在pro02-maven-web的測(cè)試程序中加入servlet-api.jar包中的類。
修改:pro02-maven-web\src\test\java\com\atguigu\maven\CalculatorTest.java
package com.atguigu.maven;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import org.junit.Test;
import com.atguigu.maven.Calculator;
// 靜態(tài)導(dǎo)入的效果是將Assert類中的靜態(tài)資源導(dǎo)入當(dāng)前類
// 這樣一來(lái),在當(dāng)前類中就可以直接使用Assert類中的靜態(tài)資源,不需要寫類名
import static org.junit.Assert.*;
public class CalculatorTest{
@Test
public void testSum(){
// 1.創(chuàng)建Calculator對(duì)象
Calculator calculator = new Calculator();
// 2.調(diào)用Calculator對(duì)象的方法,獲取到程序運(yùn)行實(shí)際的結(jié)果
int actualResult = calculator.sum(5, 3);
// 3.聲明一個(gè)變量,表示程序運(yùn)行期待的結(jié)果
int expectedResult = 8;
// 4.使用斷言來(lái)判斷實(shí)際結(jié)果和期待結(jié)果是否一致
// 如果一致:測(cè)試通過(guò),不會(huì)拋出異常
// 如果不一致:拋出異常,測(cè)試失敗
assertEquals(expectedResult, actualResult);
}
}
然后運(yùn)行Maven的編譯命令:mvn compile
然后看到編譯成功。
第七節(jié) 實(shí)驗(yàn)七:測(cè)試依賴的傳遞性
1、依賴的傳遞性
①概念
A依賴B,B依賴C,那么在A沒(méi)有配置對(duì)C的依賴的情況下,A里面能不能直接使用C?
②傳遞的原則
在A依賴B,B依賴C的前提下,C是否能夠傳遞到A,取決于B依賴C時(shí)使用的依賴范圍。
B依賴C時(shí)使用compile范圍:可以傳遞B依賴C時(shí)使用test或provided范圍:不能傳遞,所以需要這樣的jar包時(shí),就必須在需要的地方明確配置依賴才可以。
2、使用compile范圍依賴spring-core
測(cè)試方式:讓pro01-maven-java工程依賴spring-core
具體操作:編輯pro01-maven-java工程根目錄下pom.xml
使用mvn dependency:tree命令查看效果:
[INFO] com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT [INFO] ± junit:junit:jar:4.12:test [INFO] | - org.hamcrest:hamcrest-core:jar:1.3:test [INFO] - org.springframework:spring-core:jar:4.0.0.RELEASE:compile [INFO] - commons-logging:commons-logging:jar:1.1.1:compile
還可以在Web工程中,使用mvn dependency:tree命令查看效果(需要重新將pro01-maven-java安裝到倉(cāng)庫(kù)):
[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT [INFO] ± junit:junit:jar:4.12:test [INFO] | - org.hamcrest:hamcrest-core:jar:1.3:test [INFO] ± javax.servlet:javax.servlet-api:jar:3.1.0:provided [INFO] - com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile [INFO] - org.springframework:spring-core:jar:4.0.0.RELEASE:compile [INFO] - commons-logging:commons-logging:jar:1.1.1:compile
3、驗(yàn)證test和provided范圍不能傳遞
從上面的例子已經(jīng)能夠看到,pro01-maven-java依賴了junit,但是在pro02-maven-web工程中查看依賴樹的時(shí)候并沒(méi)有看到j(luò)unit。
要驗(yàn)證provided范圍不能傳遞,可以在pro01-maven-java工程中加入servlet-api的依賴。
效果還是和之前一樣:
[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT [INFO] ± junit:junit:jar:4.12:test [INFO] | - org.hamcrest:hamcrest-core:jar:1.3:test [INFO] ± javax.servlet:javax.servlet-api:jar:3.1.0:provided [INFO] - com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile [INFO] - org.springframework:spring-core:jar:4.0.0.RELEASE:compile [INFO] - commons-logging:commons-logging:jar:1.1.1:compile
第八節(jié) 實(shí)驗(yàn)八:測(cè)試依賴的排除
1、概念
當(dāng)A依賴B,B依賴C而且C可以傳遞到A的時(shí)候,但是A不想要C,需要在A里面把C排除掉。而往往這種情況都是為了避免jar包之間的沖突。
所以配置依賴的排除其實(shí)就是阻止某些jar包的傳遞。因?yàn)檫@樣的jar包傳遞過(guò)來(lái)會(huì)和其他jar包沖突。
2、配置方式
3、測(cè)試
測(cè)試的方式:在pro02-maven-web工程中配置對(duì)commons-logging的排除
運(yùn)行mvn dependency:tree命令查看效果:
[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT [INFO] ± junit:junit:jar:4.12:test [INFO] | - org.hamcrest:hamcrest-core:jar:1.3:test [INFO] ± javax.servlet:javax.servlet-api:jar:3.1.0:provided [INFO] - com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile [INFO] - org.springframework:spring-core:jar:4.0.0.RELEASE:compile
發(fā)現(xiàn)在spring-core下面就沒(méi)有commons-logging了。
第九節(jié) 實(shí)驗(yàn)九:繼承
1、概念
Maven工程之間,A工程繼承B工程
B工程:父工程A工程:子工程
本質(zhì)上是A工程的pom.xml中的配置繼承了B工程中pom.xml的配置。
2、作用
在父工程中統(tǒng)一管理項(xiàng)目中的依賴信息,具體來(lái)說(shuō)是管理依賴信息的版本。
3、舉例
在一個(gè)工程中依賴多個(gè)Spring的jar包
[INFO] ± org.springframework:spring-core:jar:4.0.0.RELEASE:compile [INFO] | - commons-logging:commons-logging:jar:1.1.1:compile [INFO] ± org.springframework:spring-beans:jar:4.0.0.RELEASE:compile [INFO] ± org.springframework:spring-context:jar:4.0.0.RELEASE:compile [INFO] ± org.springframework:spring-expression:jar:4.0.0.RELEASE:compile [INFO] ± org.springframework:spring-aop:jar:4.0.0.RELEASE:compile [INFO] | - aopalliance:aopalliance:jar:1.0:compile
使用Spring時(shí)要求所有Spring自己的jar包版本必須一致。為了能夠?qū)@些jar包的版本進(jìn)行統(tǒng)一管理,我們使用繼承這個(gè)機(jī)制,將所有版本信息統(tǒng)一在父工程中進(jìn)行管理。
4、操作
①創(chuàng)建父工程
創(chuàng)建的過(guò)程和前面創(chuàng)建pro01-maven-java一樣。
工程名稱:pro03-maven-parent
工程創(chuàng)建好之后,要修改它的打包方式:
只有打包方式為pom的Maven工程能夠管理其他Maven工程。
②創(chuàng)建模塊工程
模塊工程類似于IDEA中的module,所以需要進(jìn)入pro03-maven-parent工程的根目錄,然后運(yùn)行mvn archetype:generate命令來(lái)創(chuàng)建模塊工程。
假設(shè),我們創(chuàng)建三個(gè)模塊工程:
③查看被添加新內(nèi)容的父工程pom.xml
下面modules和module標(biāo)簽是聚合功能的配置
④解讀子工程的pom.xml
⑤在父工程中配置依賴的統(tǒng)一管理
⑥子工程中引用那些被父工程管理的依賴
關(guān)鍵點(diǎn):省略版本號(hào)
⑦在父工程中升級(jí)依賴信息的版本
……
……
然后在子工程中運(yùn)行mvn dependency:list,效果如下:
[INFO] org.springframework:spring-aop:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-core:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-context:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-beans:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-expression:jar:4.1.4.RELEASE:compile
⑧在父工程中聲明自定義屬性
在需要的地方使用${}的形式來(lái)引用自定義的屬性名:
真正實(shí)現(xiàn)“一處修改,處處生效”。
5、實(shí)際意義
編寫一套符合要求、開發(fā)各種功能都能正常工作的依賴組合并不容易。如果公司里已經(jīng)有人總結(jié)了成熟的組合方案,那么再開發(fā)新項(xiàng)目時(shí),如果不使用原有的積累,而是重新摸索,會(huì)浪費(fèi)大量的時(shí)間。為了提高效率,我們可以使用工程繼承的機(jī)制,讓成熟的依賴組合方案能夠保留下來(lái)。
如上圖所示,公司級(jí)的父工程中管理的就是成熟的依賴組合方案,各個(gè)新項(xiàng)目、子系統(tǒng)各取所需即可。
第十節(jié) 實(shí)驗(yàn)十:聚合
1、聚合本身的含義
部分組成整體
動(dòng)畫片《戰(zhàn)神金剛》中的經(jīng)典臺(tái)詞:“我來(lái)組成頭部!我來(lái)組成手臂!”就是聚合關(guān)系最生動(dòng)的體現(xiàn)。
2、Maven中的聚合
使用一個(gè)“總工程”將各個(gè)“模塊工程”匯集起來(lái),作為一個(gè)整體對(duì)應(yīng)完整的項(xiàng)目。
項(xiàng)目:整體模塊:部分
概念的對(duì)應(yīng)關(guān)系:
從繼承關(guān)系角度來(lái)看:
父工程子工程
從聚合關(guān)系角度來(lái)看:
總工程模塊工程
3、好處
一鍵執(zhí)行Maven命令:很多構(gòu)建命令都可以在“總工程”中一鍵執(zhí)行。 以mvn install命令為例:Maven要求有父工程時(shí)先安裝父工程;有依賴的工程時(shí),先安裝依賴的工程。我們自己考慮這些規(guī)則會(huì)很麻煩。但是工程聚合之后,在總工程執(zhí)行mvn install可以一鍵完成安裝,而且會(huì)自動(dòng)按照正確的順序執(zhí)行。 配置聚合之后,各個(gè)模塊工程會(huì)在總工程中展示一個(gè)列表,讓項(xiàng)目中的各個(gè)模塊一目了然。
4、聚合的配置
在總工程中配置modules即可:
5、依賴循環(huán)問(wèn)題
如果A工程依賴B工程,B工程依賴C工程,C工程又反過(guò)來(lái)依賴A工程,那么在執(zhí)行構(gòu)建操作時(shí)會(huì)報(bào)下面的錯(cuò)誤:
[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:
這個(gè)錯(cuò)誤的含義是:循環(huán)引用。
第四章 使用Maven:IDEA環(huán)境
第一節(jié) 創(chuàng)建父工程
第二節(jié) 配置Maven信息
第三節(jié) 創(chuàng)建模塊工程
第四節(jié) 創(chuàng)建Web工程
1、創(chuàng)建模塊
按照前面的同樣操作創(chuàng)建模塊,此時(shí)這個(gè)模塊其實(shí)還是一個(gè)Java工程。
2、修改打包方式
3、增加目錄
4、借助IDEA生成web.xml
第五節(jié) 其他操作
1、在IDEA中執(zhí)行Maven命令
2、在IDEA中查看某個(gè)模塊的依賴信息
第五章 jar包下載失敗問(wèn)題的解決方案
第一節(jié) 提出問(wèn)題
Maven替我們?nèi)ハ螺djar包的時(shí)候,有可能出現(xiàn)在網(wǎng)絡(luò)傳輸過(guò)程中數(shù)據(jù)丟失、中途斷網(wǎng),從而導(dǎo)致下載失敗。
第二節(jié) Maven正常下載的做法
jar包在下載過(guò)程中,jar包的擴(kuò)展名是xxx.jar.lastUpdatedjar包下載成功后,Maven會(huì)將lastUpdated擴(kuò)展名刪除,讓jar包恢復(fù)為xxx.jar這樣的名稱
第三節(jié) 下載失敗的第一種情況
1、Maven的行為描述
jar包在下載過(guò)程中,jar包的擴(kuò)展名是xxx.jar.lastUpdated網(wǎng)絡(luò)連接丟失,無(wú)法繼續(xù)下載jar包沒(méi)有下載完,lastUpdated擴(kuò)展名不會(huì)被刪除當(dāng)我們要求Maven重新下載時(shí),Maven看到這個(gè)jar包的擴(kuò)展名是lastUpdated,Maven就不管了
2、解決辦法
手動(dòng)刪除所有以lastUpdated結(jié)尾的文件,然后讓Maven重新下載??墒钱?dāng)倉(cāng)庫(kù)中l(wèi)astUpdated文件太多的時(shí)候,手動(dòng)刪除不可行,所以我們需要借助批處理文件:clearLastUpdated.bat。使用方法:
將clearLastUpdated.bat文件復(fù)制到本地倉(cāng)庫(kù)的根目錄使用文件編輯打開clearLastUpdated.bat文件修改下面的內(nèi)容
SET CLEAR_PATH=設(shè)置為本地倉(cāng)庫(kù)所在的盤符 SET CLEAR_DIR=設(shè)置為本地倉(cāng)庫(kù)的根目錄的路徑
例如:
SET CLEAR_PATH=D: SET CLEAR_DIR=D:\maven-rep1026
在想要執(zhí)行清理時(shí),雙擊運(yùn)行這個(gè)文件即可
3、要求Maven重新下載jar包
第四節(jié) 下載失敗的第二種情況
1、文件校驗(yàn)工具
jar包表面上看起來(lái)是下載完的狀態(tài),結(jié)尾并沒(méi)有“.lastUpdated”擴(kuò)展名。但是程序運(yùn)行時(shí)找不到這個(gè)jar包中的類。例如:針對(duì)jar包中的類出現(xiàn)ClassNotFoundException。
遇到類似問(wèn)題需要先確認(rèn)一下“有嫌疑”的jar包是否存在內(nèi)部損壞問(wèn)題。此時(shí)可以使用上面的文件校驗(yàn)工具。
2、用法
打開文件校驗(yàn)工具將待校驗(yàn)的jar包拖拽到文件校驗(yàn)工具窗口內(nèi)將待校驗(yàn)的jar包旁邊的*.sha1文件打開比較兩個(gè)SHA1值一致:jar包完好不一致:jar包損壞
3、原理
HASH加密包括很多具體加密算法,但是所有HASH算法都滿足下面特征:
只要輸入數(shù)據(jù)不變,任何時(shí)候執(zhí)行加密,輸出不變輸入數(shù)據(jù)有細(xì)微變化,輸出數(shù)據(jù)跟著變化不可逆,不能通過(guò)密文反推回明文每一種具體的HASH加密算法加密后長(zhǎng)度固定
4、找到有嫌疑的jar包
假設(shè)現(xiàn)在出現(xiàn)了一個(gè)ClassNotFoundException,提示找不到類:org.springframework.expression.Expression。此時(shí)我們懷疑這個(gè)類所在的jar包下載失敗。
竅門1:類所在的package命名往往和jar包坐標(biāo)的groupId部分類似。竅門2:在IDEA中按兩下Shift鍵,使用全類名搜索
找到j(luò)ar包后,點(diǎn)右鍵→Show in Explorer
竅門3:如果前面的辦法都沒(méi)法定位,只能根據(jù)這個(gè)類看上去的特征和可能的功能找有可能有關(guān)的jar包
5、為什么不建議刪整個(gè)庫(kù)
整個(gè)庫(kù)刪除后,需要重新下載整個(gè)庫(kù)。此時(shí)東邊的jar包沒(méi)有失敗,可能西邊的jar包會(huì)失敗。整個(gè)庫(kù)整體重新下載時(shí),會(huì)有很多jar包并行下載的,相對(duì)來(lái)說(shuō)并行下載本身就容易丟失數(shù)據(jù)。
柚子快報(bào)激活碼778899分享:java Maven 總結(jié)
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。