日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

把Maven的架構(gòu),用法,坑點(diǎn)介紹的清清楚楚

 

沒有Maven之前的日子

個(gè)人的一個(gè)小感受,學(xué)習(xí)一個(gè)新技術(shù),應(yīng)該以歷史的眼光開看待這個(gè)新技術(shù)出現(xiàn)的原因,以及幫我們解決了什么問題。我們來回憶一下沒有Maven的日子是怎么樣的?

  1. 開發(fā)一個(gè)項(xiàng)目,需要用別人寫好的jar包,我們先把開源的jar包下載下來放到項(xiàng)目的lib目錄下,并把這個(gè)目錄添加到CLASSPATH(告訴JAVA執(zhí)行環(huán)境,在哪些目錄下可以找到你要執(zhí)行的Java程序需要的類或者包)
  2. 我們下載了a.jar發(fā)現(xiàn)a.jar還需要依賴b.jar,結(jié)果又去把b.jar包下載下來開始運(yùn)行
  3. 如果運(yùn)氣夠好,我們的項(xiàng)目在添加完所有的依賴后,能正產(chǎn)運(yùn)行了。如果運(yùn)氣差點(diǎn),還會(huì)遇到版本的問題,例如a.jar在調(diào)用b.jar的時(shí)候發(fā)現(xiàn)b.jar根本沒有這個(gè)方法,在別的版本中才有,現(xiàn)在好了,光找依賴和適配版本就能花上不少時(shí)間
  4. 而且我們往git上上傳代碼的時(shí)候,還必須把這些lib都上傳上去。別人下載我們的代碼時(shí)也必須把lib下載下來,這個(gè)真心耗費(fèi)時(shí)間

這時(shí)候Maven作為Java世界的包管理工具出現(xiàn)了,當(dāng)然Java世界還有其他包管理工具,例如gradle等。就像yum是linux世界的包管理工具,webpack是前端世界的包管理工具一樣

Maven倉庫的種類

把Maven的架構(gòu),用法,坑點(diǎn)介紹的清清楚楚

 

Maven找jar包的過程是這樣的,先在本地倉庫找,找不到再去私服(如果配置了的話),再找不到去中央倉庫(
http://repo1.maven.org/maven2/,maven團(tuán)隊(duì)負(fù)責(zé)維護(hù))

從中央倉庫找到后,會(huì)在私服和本地倉庫放一份,從私服找到后也會(huì)在本地倉庫放一份

當(dāng)你安裝在好了Maven以后,在conf目錄下有個(gè)settings.xml文件,這個(gè)里面配置的項(xiàng)很多,后文會(huì)詳細(xì)介紹這個(gè)配置文件。

<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->

在這個(gè)配置文件下有這樣一段話,說了Maven默認(rèn)的本地倉庫地址為${user.home}/.m2/repository(當(dāng)然你可以重新設(shè)置本地倉庫的地址,上面就是模板),我是window電腦,來看看這個(gè)目錄

把Maven的架構(gòu),用法,坑點(diǎn)介紹的清清楚楚

 

看到有很多jar包被存到本地,當(dāng)然如果你想配置私服也是在settings.xml上進(jìn)行配置,隨便一搜很多教程,不再贅述

搭建私服好處多多,在一個(gè)公司內(nèi)部可以開發(fā)一些公共的基礎(chǔ)組件放到私服上,方便其他同事使用

Maven的默認(rèn)配置

一個(gè)Maven的項(xiàng)目的整體結(jié)構(gòu)是這樣的

把Maven的架構(gòu),用法,坑點(diǎn)介紹的清清楚楚

 

在這里插入圖片描述

為什么一個(gè)Maven項(xiàng)目的文件結(jié)構(gòu)是這種的呢?

這就不得不說到Maven的一個(gè)特性,約定優(yōu)于配置。

Maven默認(rèn)配置了${project.basedir}/src/main/java為項(xiàng)目的源代碼目錄

${project.basedir}/src/main/test為項(xiàng)目的測試代碼目錄

${project.basedir}/target為項(xiàng)目的編譯輸出目錄等

spring boot就是約定優(yōu)于配置的體現(xiàn),想想我們用spring mvc的時(shí)候還得配置視圖解析器,包的自動(dòng)掃描,而用了spring boot框架,我們就完全不用再配置了

Maven項(xiàng)目詳解

安裝還是挺簡單的,我就不再介紹,我也沒有單獨(dú)下載,一般就用了Idea自帶的Maven了,下載完后目錄結(jié)構(gòu)如下:

把Maven的架構(gòu),用法,坑點(diǎn)介紹的清清楚楚

 

bin目錄:

該目錄包含了mvn運(yùn)行的腳本,這些腳本用來配置java命令,準(zhǔn)備好classpath和相關(guān)的Java系統(tǒng)屬性,然后執(zhí)行Java命令。

boot目錄:

該目錄只包含一個(gè)文件,該文件為
plexus-classworlds-2.5.2.jar。plexus-classworlds是一個(gè)類加載器框架,相對(duì)于默認(rèn)的java類加載器,它提供了更加豐富的語法以方便配置,Maven使用該框架加載自己的類庫。

conf目錄:

該目錄包含了一個(gè)非常重要的文件settings.xml。直接修改該文件,就能在機(jī)器上全局地定制maven的行為,即對(duì)所有用戶都生效。一般情況下,我們更偏向于復(fù)制該文件至~/.m2/目錄下(~表示用戶家目錄,windows下~就是C:UsersPeng,Peng是小編的用戶名),然后修改該文件,在用戶級(jí)別定制Maven的行為。

lib目錄:

該目錄包含了所有Maven運(yùn)行時(shí)需要的Java類庫,Maven本身是分模塊開發(fā)的,因此用戶能看到諸如maven-core-3.0.jar、maven-model-3.0.jar之類的文件,此外這里還包含一些Maven用到的第三方依賴如commons-cli-1.2.jar、commons-lang-2.6.jar等等。、

settings.xml配置文件詳解

我們來詳細(xì)說一下settings.xml這個(gè)文件,這個(gè)文件可以定制Maven的行為,上面已經(jīng)說到settings.xml可以放在2個(gè)位置,~/.m2/setting.xml(默認(rèn)沒有,需要我們自己復(fù)制)和${maven.home}/conf/setting.xml

這2個(gè)配置文件的加載順序?yàn)閪/.m2/setting.xml>${maven.home}/conf/setting.xml,為了不影響他人,所以我們將conf下的settings.xml復(fù)制到家目錄,在用戶級(jí)別定制Maven的行為。

把Maven的架構(gòu),用法,坑點(diǎn)介紹的清清楚楚

 

這個(gè)和配置環(huán)境變量有點(diǎn)類似,Windos和Linux都可以配置系統(tǒng)級(jí)別的環(huán)境變量和用戶級(jí)別的環(huán)境變量,這里單說一下Linux的吧,在/etc/profile里面配置的就是系統(tǒng)級(jí)別的環(huán)境變量,在~/.bash_profile里面配置的就是用戶級(jí)別的環(huán)境變量

各種配置項(xiàng)還是挺多的,設(shè)置鏡像倉庫(國內(nèi)用阿里云的比較多),設(shè)置代理,不再贅述

maven常用命令

把Maven的架構(gòu),用法,坑點(diǎn)介紹的清清楚楚

 

當(dāng)然也可以連著使用

mvn clean package 清理打包

mvn clean package -DskipTests=true 清理打包,并跳過測試用例

mvn clean install 清理打包,并將jar包或者war包復(fù)制到本地倉庫

運(yùn)行單測的時(shí)候也沒必要一個(gè)一個(gè)點(diǎn)測試方法,mvn test 一個(gè)命令跑完所有測試用例,

要注意的是只會(huì)執(zhí)行以Test開頭或者結(jié)尾的測試類,也沒必要自己寫測試類,我在推薦閱讀第一篇文章中演示了快速生成測試類的方法,可以去看看,生成的測試類都是以Test結(jié)尾的

mvn dependency:tree > show.txt 將依賴輸出重定向到文件中,方便查看

pom.xml詳解

groupId 公司域名倒過來

artifactId 功能命名

version 版本號(hào)

這三個(gè)維度確定一個(gè)jar包,就像用(x,y,z)坐標(biāo)在三維空間中唯一確定一個(gè)點(diǎn)。

packaging 打包方式,jar,war,maven-plugin(開發(fā)maven插件)

scope詳解

參數(shù)解釋是否會(huì)被打入最終的jar包c(diǎn)ompile默認(rèn)的scope是test測試使用否provided編譯需要否runtime編譯不需要,運(yùn)行時(shí)需要(接口與實(shí)現(xiàn)分離)是system加載本地jar否

類似如下這種,沒有指定scope,說明scope是compile

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.2</version>
</dependency>

test是指在運(yùn)行測試用例的時(shí)候才會(huì)用到,沒必要打入到最后的jar里面,所以你看到的測試框架的scope基本上都是test

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
</dependency>

provided,編譯的時(shí)候會(huì)用到,但不會(huì)被打入最后的jar包

例如想把spring boot項(xiàng)目以war包的形式放在Tomcat中運(yùn)行,首先得加入如下依賴

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-tomcat</artifactId>
 <scope>provided</scope>
</dependency>

或者你寫了一個(gè)放在Storm集群或者Flink集群上運(yùn)行的任務(wù),最后都要把Storm的依賴或者Flink的依賴設(shè)置成provided,因?yàn)榧荷弦呀?jīng)都有這些環(huán)境的jar包、

如果你用到lombok插件的話,你會(huì)發(fā)現(xiàn)lombok的Maven是如下形式,說明它只會(huì)編譯的時(shí)候會(huì)用到。

<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.16.6</version>
 <scope>provided</scope>
</dependency>

我寫了如下一個(gè)測試類

@Data
public class Test {
 private String name;
 private int age;
}

生成的class文件反編譯后的如下,驗(yàn)證了我們的想法,編譯之后確實(shí)沒有必要再用lombok這個(gè)jar包

public class Test {
 private String name;
 private int age;
 public Test() {
 }
 public String getName() {
 return this.name;
 }
 public int getAge() {
 return this.age;
 }
 public void setName(String name) {
 this.name = name;
 }
 public void setAge(int age) {
 this.age = age;
 }
}

runtime,運(yùn)行時(shí)才會(huì)用到。例如,如果你的項(xiàng)目有對(duì)數(shù)據(jù)庫的操作,但沒有加入相應(yīng)的JDBC的實(shí)現(xiàn)jar包,如MySQL-connector-java,是可以編譯成功的,只有運(yùn)行時(shí)才會(huì)報(bào)錯(cuò)。所以你看到的JDBC實(shí)現(xiàn)的jar包scope為runtime,表明這個(gè)jar包在運(yùn)行時(shí)才會(huì)用到

<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.35</version>
 <scope>runtime</scope>
</dependency>

system,本地加載jar,當(dāng)你和第三方公司合作,他們只是給了你一個(gè)jar包時(shí),你可以有三種選擇

  1. mvn install到本地倉庫
  2. mvn deploy到私服
  3. 指定jar包路徑,從本地加載,例如如下pom形式
 <dependency>
 <groupId>com.tievd.third</groupId>
 <artifactId>arcvideo</artifactId>
 <version>1.0</version>
 <scope>system</scope>
 <systemPath>${basedir}/lib/face-api-1.0.jar</systemPath>
</dependency>

前文已經(jīng)說到scope為system的依賴不會(huì)被打入最終的jar包,得通過配置插件等方式將依賴打入最終的jar包,所以這種方式一般很少使用。

還沒寫完,后續(xù)更精彩

本文為小編原創(chuàng)文章,首發(fā)于Java識(shí)堂,一個(gè)高原創(chuàng),高收藏,有干貨的微信公眾號(hào),一起成長,一起進(jìn)步,歡迎關(guān)注

分享到:
標(biāo)簽:Maven
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評(píng)定2018-06-03

通用課目體育訓(xùn)練成績評(píng)定