摘要:學(xué)習(xí)筆記先生,您在寫代碼嗎不,我們正在完成一項(xiàng)偉大的工程。于是打算重新學(xué)習(xí)一下。中央倉(cāng)庫(kù)鏡像為了分擔(dān)中央倉(cāng)庫(kù)的流量,提升用戶的訪問速度。生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)。修改源碼后也需要逐個(gè)手動(dòng)進(jìn)行操作。
maven學(xué)習(xí)筆記
先生,您在寫代碼嗎? 不,我們正在完成一項(xiàng)偉大的工程。前言
在剛學(xué)maven時(shí),我就把maven當(dāng)作一個(gè)引入jar包的工具而已,以前是自己下載jar包,現(xiàn)在是只用在pom文件中填寫相應(yīng)的坐標(biāo)就可以了。除此之外當(dāng)我們需要使用的jar包依賴于另一個(gè)jar包時(shí),maven會(huì)自動(dòng)幫我們引入適用的版本。這就避免了我們自己下jar包,然后版本不匹配的問題。除此之外,我還模糊的知道一些maven的聚合和繼承,之后在接手項(xiàng)目的時(shí)候還是吃了的大虧。于是打算重新學(xué)習(xí)一下maven。
maven是什么?Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project"s build, reporting and documentation from a central piece of information.
comprehension: the ability to understand something 理解力
maven是一種軟件項(xiàng)目管理和理解的工具?;陧?xiàng)目對(duì)象模型的概念。
但是在后面的what is maven? 我看到這么一句話:
We hope that we have created something that will make the day-to-day work of Java developers easier and generally help with the comprehension of any Java-based project.為什么能夠幫助開發(fā)人員理解工程?
我們希望我們編寫的這個(gè)工具能夠使得java程序員的工作變得簡(jiǎn)單,使得任何使用該工具的任何java工程更加容易理解。
Maven約定了目錄架構(gòu)
如果你在java中放配置文件,很可能會(huì)報(bào)找不到文件的異常。
但是我就是想在java這個(gè)文件夾中放配置文件,該怎么辦呢? 你需要在pom文件中聲明一下
Maven的定位src/main/java **/*.xml true
多數(shù)博客或者視頻都將maven定義為自動(dòng)化構(gòu)建工具。
那什么是自動(dòng)化構(gòu)建工具呢?
我們首先來解釋構(gòu)建:
編譯
將java源文件變成字節(jié)碼,交給JVM去執(zhí)行
部署
一個(gè)BS項(xiàng)目最終運(yùn)行的并不是動(dòng)態(tài)web工程本身,而是這個(gè)動(dòng)態(tài)web工程“編譯的結(jié)果”
構(gòu)建各個(gè)過程的步驟:
清理: 將以前編譯得到的舊字節(jié)碼刪除掉
編譯: 將java源代碼變成字節(jié)碼
測(cè)試: 執(zhí)行test文件夾中的測(cè)試程序
報(bào)告: 顯示測(cè)試程序執(zhí)行的結(jié)果
打包: 動(dòng)態(tài)Web工程打成war包,Java工程打成jar包
安裝: Maven的特定概念---將打包得到的文件復(fù)制到"倉(cāng)庫(kù)"中指定的位置
部署: 將動(dòng)態(tài)Web工程生成的war包復(fù)制到Servlet容器中指定的目錄下,使其可以運(yùn)行
自動(dòng)化構(gòu)建,其實(shí)上述步驟,在elipse和IDEA中也可以完成,只不過沒那么標(biāo)準(zhǔn)。既然IDE已經(jīng)可以完成這些工作了,那么還要maven干什么呢?
日常開發(fā)中,以下幾個(gè)步驟是我們經(jīng)常走的:
編譯
打包
部署
測(cè)試
這幾個(gè)步驟是程式化的,沒有太大的變數(shù)或者說根本就沒有變數(shù)。程序員們很希望從這些重復(fù)的工作中脫身出來,將這些重復(fù)的工作交給工具去做。此時(shí)Maven的意義就體現(xiàn)出來了,它可以自動(dòng)的從構(gòu)建過程中的起點(diǎn)一直執(zhí)行到終點(diǎn)。
maven的核心概念POM
坐標(biāo)
依賴
倉(cāng)庫(kù)
生命周期/插件/目標(biāo)
繼承
聚合
POMPOM: a project object model.項(xiàng)目對(duì)象模型
對(duì)這個(gè)概念老實(shí)說,我并沒有很深的理解,或者說我并不理解項(xiàng)目對(duì)象模型的意思。
有資料說項(xiàng)目對(duì)象模型就是將Java工程的相關(guān)信息封裝為對(duì)象便于操作和管理的模型。
這個(gè)解釋的稍微讓人那么容易那么一點(diǎn)。
學(xué)習(xí)Maven就是學(xué)習(xí)pom.xml文件中的配置
坐標(biāo)這個(gè)概念我覺得和依賴結(jié)合起來解釋會(huì)更好,在沒有Maven之前,我們引入jar包的方式就是先下載, 然后在復(fù)制在類文件路徑下,你的項(xiàng)目需要的jar包,在Maven看來就是你的項(xiàng)目依賴于某些jar包, pom.xml文件中填寫對(duì)應(yīng)jar包的位置, 就可以引入對(duì)應(yīng)的jar包
使用如下三個(gè)向量在 Maven 的倉(cāng)庫(kù)中唯一的確定一個(gè) Maven 工程。
[1] groupid:公司或組織的域名倒序+當(dāng)前項(xiàng)目名稱 [2] artifactId:當(dāng)前項(xiàng)目的模塊名稱 [3] version:當(dāng)前模塊的版本com.atguigu.maven Hello 0.0.1-SNAPSHOT
其實(shí)引入對(duì)象的依賴非常的簡(jiǎn)單,我們只用去Maven的中央倉(cāng)庫(kù),輸入jar包的名字,選擇你需要的版本,然后將復(fù)制倉(cāng)庫(kù)給出的依賴,粘貼在pom.xml文件中的dependencies標(biāo)簽下就可以了.
步驟如下:
百度搜索Maven
進(jìn)入之后
比如說我想要Spring-test的jar包
然后選擇對(duì)應(yīng)的版本:
倉(cāng)庫(kù)倉(cāng)庫(kù)可以理解為存放jar包的地方。
倉(cāng)庫(kù)的分類
本地倉(cāng)庫(kù):當(dāng)前電腦上的部署的倉(cāng)庫(kù)目錄,為當(dāng)前電腦上的所有Maven工程服務(wù)
遠(yuǎn)程倉(cāng)庫(kù):
(1) 私服: 搭建在局域網(wǎng)環(huán)境中,為局域網(wǎng)范圍內(nèi)的所有Maven工程服務(wù) (2) 中央倉(cāng)庫(kù): 架設(shè)在Internet上,為全世界范圍內(nèi)所有的Maven工程服務(wù)。 (3) 中央倉(cāng)庫(kù)鏡像: 為了分擔(dān)中央倉(cāng)庫(kù)的流量,提升用戶的訪問速度。
使用properties標(biāo)簽內(nèi)自定義標(biāo)簽統(tǒng)一聲明版本號(hào)
生命周期/插件/目標(biāo)什么是Maven的生命周期?
Maven 生命周期定義了各個(gè)構(gòu)建環(huán)節(jié)的執(zhí)行順序,有了這個(gè)清單,Maven 就可以自動(dòng)化的執(zhí)行構(gòu)建命令了。
Maven有三套互相獨(dú)立的生命周期:
① Clean Lifecycle 在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作
② Default Lifecycle 構(gòu)建的核心部分,編譯,測(cè)試,打包,安裝,部署等等。
③ Site Lifecycle 生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)。
它們是相互獨(dú)立的,你可以僅僅調(diào)用 clean 來清理工作目錄,僅僅調(diào)用 site 來生成站點(diǎn)。當(dāng)然你也可以
直接運(yùn)行 mvn clean install site 運(yùn)行所有這三套生命周期。
這個(gè)生成站點(diǎn)的意思就是: 在本地生成有關(guān)你項(xiàng)目的相關(guān)信息。
長(zhǎng)這個(gè)樣子:
Clean生命周期:
Clean 生命周期一共包含了三個(gè)階段: 1 pre-clean 執(zhí)行一些需要在 clean 之前完成的工作 2 clean 移除所有上一次構(gòu)建生成的文件 3 post-clean 執(zhí)行一些需要在 clean 之后立刻完成的工作
Site生命周期
1 pre-site 執(zhí)行一些需要在生成站點(diǎn)文檔之前完成的工作 2 site 生成項(xiàng)目的站點(diǎn)文檔 3 post-site 執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備 4 site-deploy 將生成的站點(diǎn)文檔部署到特定的服務(wù)器上 這里經(jīng)常用到的是 site 階段和 site-deploy 階段,用以生成和發(fā)布 Maven 站點(diǎn),這可是 Maven相當(dāng)強(qiáng)大的功能, Manager比較喜歡,文檔及統(tǒng)計(jì)數(shù)據(jù)自動(dòng)生成,很好看。
Default 生命周期是 Maven 生命周期中最重要的一個(gè),絕大部分工作都發(fā)生在這個(gè)生命周期中。這里,
只解釋一些比較重要和常用的階段:
validate generate-sources process-sources generate-resources process-resources 復(fù)制并處理資源文件,至目標(biāo)目錄,準(zhǔn)備打包。 compile 編譯項(xiàng)目的源代碼。 process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources 復(fù)制并處理資源文件,至目標(biāo)測(cè)試目錄。 test-compile 編譯測(cè)試源代碼。 process-test-classes test 使用合適的單元測(cè)試框架運(yùn)行測(cè)試。這些測(cè)試代碼不會(huì)被打包或部署。 prepare-package package 接受編譯好的代碼,打包成可發(fā)布的格式,如 JAR 。 pre-integration-test integration-test post-integration-test verify install 將包安裝至本地倉(cāng)庫(kù),以讓其它項(xiàng)目依賴。 deploy 將最終的包復(fù)制到遠(yuǎn)程的倉(cāng)庫(kù),以讓其它開發(fā)人員與項(xiàng)目共享
maven生命周期(lifecycle)由各個(gè)階段組成,每個(gè)階段由maven的插件plugin來執(zhí)行完成。
當(dāng)我們執(zhí)行的maven命令需要用到某些插件時(shí),Maven的核心程序會(huì)首先到本地倉(cāng)庫(kù)中查找
本地倉(cāng)庫(kù)的默認(rèn)位置: 可以在配置文件中指定
我查的資料是
依賴 依賴的范圍① complie
對(duì)主程序是否有效:有效
對(duì)測(cè)試程序是否有效: 有效
是否參與打包: 參與
是否參與部署: 參與
典型例子: Spring-core
② test
對(duì)主程序是否有效: 無效
對(duì)測(cè)試程序是否有效: 有效
是否參與打包: 不參與
是否參與部署: 不參與
典型例子: junit
③ provided
對(duì)主程序是否有效: 有效
對(duì)測(cè)試程序是否有效: 有效
是否參與打包: 不參與
是否參與部署: 不參與
典型例子: servlet-api.jar
依賴的傳遞性模塊A依賴于模塊B。
模塊B又依賴于C模塊
則模塊A內(nèi)會(huì)有C模塊。
讓我們把以上的例子在通俗化一些:
模塊C引入了Spring-corejar包, 那么模塊C中的Maven依賴就會(huì)有以下兩個(gè)jar包。
模塊A引入模塊B,就會(huì)順帶把這兩個(gè)jar包一并引入。
模塊A的pom:
但是現(xiàn)在我并不想要commons-logging這個(gè)jar包該怎么辦呢?
我們可以排除依賴:
解決jar包沖突
[1] 路徑最短者優(yōu)先
[2] 路徑相同時(shí),先聲明者優(yōu)先
這里指的先聲明者優(yōu)先,是指A、B模塊在A模塊中denpendency標(biāo)簽配置的先后順序。誰在上面,誰就是先聲明者。
繼承繼承可以幫我們做什么?
統(tǒng)一管理依賴的版本。
一個(gè)典型的例子就是:
現(xiàn)在項(xiàng)目下A、B、C三個(gè)模塊,三個(gè)模塊都依賴著不同的Junit的版本,依賴范圍為test時(shí),依賴又不能傳遞過來, 但是我們希望能夠統(tǒng)一Junit版本,可能有的人自然會(huì)想到, 你讓A、B、C模塊pom中的Junit依賴版本寫一致不就行了,這也是個(gè)辦法。 但是maven在設(shè)計(jì)的時(shí)候估計(jì)也考慮到了這種情況,就是繼承了。
繼承該如何使用:
①
首先你需要?jiǎng)?chuàng)建一個(gè)maven工程,注意指定打包方式為pomcom.cxkStudy.maven Parent 0.0.1-SNAPSHOT 學(xué)習(xí)Maven使用 pom
②
再創(chuàng)建一個(gè)maven工程,在該模塊中指定它的父工程是誰.com.cxkStudy.maven Parent 0.0.1-SNAPSHOT
③
在父項(xiàng)目中確定子模塊的位置../studyDenpen ../Hello
module標(biāo)簽中填的是相對(duì)于父項(xiàng)目的位置。
這也就是聚合了.
為什么要使用聚合?
將多個(gè)工程拆分為模塊后,需要手動(dòng)逐個(gè)安裝到倉(cāng)庫(kù)后依賴才能夠生效。修改源碼后也需要逐個(gè)手動(dòng)進(jìn) 行 clean 操作。而使用了聚合之后就可以批量進(jìn)行 Maven 工程的安裝、清理工作。
我們可以在父工程里面指定Junit的版本,在子模塊使用Junit的時(shí)候不寫版本就好了。
父工程中執(zhí)行Junit的版本:
junit junit 4.9 test
子模塊中引入Junit的時(shí)候不指定版本
junit junit
請(qǐng)注意配置繼承后,執(zhí)行安裝命令要先安裝父工程。
隨著我們的項(xiàng)目越來越大,src下面的包會(huì)越來越多,我曾經(jīng)在GitHub下見過一個(gè)項(xiàng)目,SRC下面有三十多個(gè)包,每個(gè)包下面又有很多類。這代碼看的我想吐,不是代碼寫的爛,而是太混雜了,結(jié)構(gòu)不清晰。我們可以將我們的項(xiàng)目根據(jù)功能進(jìn)行拆分,以避免src下出現(xiàn)太多的包。
比如說,我們可以將某一個(gè)模塊專門用來發(fā)布我們寫的功能模塊,某一個(gè)模塊放置公共類,某一個(gè)模塊存放業(yè)務(wù)代碼。這樣在結(jié)構(gòu)上會(huì)更為清晰,但這只用于比較大的工程,小的工程采用如此的拆分還是得不償失。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/75613.html
摘要:安裝下載解壓添加環(huán)境變量在文件中加入如下內(nèi)容如果需要特別設(shè)置內(nèi)存的話,可以加上這句保存,使生效查看版本設(shè)置本地倉(cāng)庫(kù)目錄下的下的文件是的配置文件新建一個(gè)文件夾,作為倉(cāng)庫(kù)的文件夾編輯修改這一行的本地倉(cāng)庫(kù),指向 安裝wget yum install wget 下載 sudo wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.0/...
摘要:本文主要記錄下配置的詳細(xì)步驟,便于初學(xué)者快速掌握及運(yùn)用。到這里,配置就算結(jié)束了,在新建一個(gè)項(xiàng)目后,會(huì)根據(jù)中的配置自動(dòng)下載對(duì)應(yīng)包??偨Y(jié)最基礎(chǔ)的配置已經(jīng)完成,更深入的配置及遇見的坑在實(shí)戰(zhàn)中不斷積累,不斷總結(jié)。 本文主要記錄Windows下IDEA 配置Maven的詳細(xì)步驟,便于初學(xué)者快速掌握及運(yùn)用。 下載Maven 直接到官網(wǎng)下載需要的版本,直接解壓到對(duì)應(yīng)的目錄即可,無需安裝。showIm...
摘要:續(xù)上一篇修改工程的,加入編譯插件說明鏡像名稱所在的目錄編寫放到目錄下面目錄在編譯鏡像查看鏡像運(yùn)行鏡像遠(yuǎn)程訪問地址出現(xiàn)表示成功生成了鏡像 續(xù)上一篇 1. 修改java工程的pom.xml , 加入docker編譯插件 com.spotify docker-maven-plugin 1.0.0 camus docker ...
閱讀 2117·2021-11-19 09:58
閱讀 1707·2021-11-15 11:36
閱讀 2874·2019-08-30 15:54
閱讀 3394·2019-08-29 15:07
閱讀 2764·2019-08-26 11:47
閱讀 2812·2019-08-26 10:11
閱讀 2503·2019-08-23 18:22
閱讀 2750·2019-08-23 17:58