乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       bylele 2019-10-23
      來(lái)源:Java識(shí)堂(ID:erlieStar)

      沒(méi)有Maven之前的日子

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

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

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

      Maven倉(cāng)庫(kù)的種類(lèi)

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

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

      當(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è)配置文件下有這樣一段話,說(shuō)了Maven默認(rèn)的本地倉(cāng)庫(kù)地址為${user.home}/.m2/repository(當(dāng)然你可以重新設(shè)置本地倉(cāng)庫(kù)的地址,上面就是模板),我是window電腦,來(lái)看看這個(gè)目錄

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

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

      Maven的默認(rèn)配置

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

      為什么一個(gè)Maven項(xiàng)目的文件結(jié)構(gòu)是這種的呢? 這就不得不說(shuō)到Maven的一個(gè)特性,約定優(yōu)于配置。

      Maven默認(rèn)配置了${project.basedir}/src/main/java為項(xiàng)目的源代碼目錄 ${project.basedir}/src/main/test為項(xiàng)目的測(cè)試代碼目錄 ${project.basedir}/target為項(xiàng)目的編譯輸出目錄等

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

      Maven項(xiàng)目詳解

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

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

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

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

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

      settings.xml配置文件詳解

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

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

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

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

      maven常用命令

      命令

      描述

      mvn -version

      顯示版本信息

      mvn clean

      刪除target目錄

      mvn compile

      編譯src/main/java下的源代碼

      mvn package

      打包,在target下生成jar包或者war包

      mvn test

      執(zhí)行src/test/java下以Test開(kāi)頭或者以Test結(jié)尾的類(lèi)的測(cè)試用例

      mvn install

      打包,并把jar包或者war包復(fù)制到本地倉(cāng)庫(kù),供其他模塊使用

      mvn deploy

      將打包的文件發(fā)布到私服

      mvn dependency:tree

      打印出項(xiàng)目的整個(gè)依賴(lài)樹(shù)

      當(dāng)然也可以連著使用 mvn clean package 清理打包 mvn clean package -DskipTests=true 清理打包,并跳過(guò)測(cè)試用例 mvn clean install 清理打包,并將jar包或者war包復(fù)制到本地倉(cāng)庫(kù)

      運(yùn)行單測(cè)的時(shí)候也沒(méi)必要一個(gè)一個(gè)點(diǎn)測(cè)試方法,mvn test 一個(gè)命令跑完所有測(cè)試用例, 要注意的是只會(huì)執(zhí)行以Test開(kāi)頭或者結(jié)尾的測(cè)試類(lèi),也沒(méi)必要自己寫(xiě)測(cè)試類(lèi),我在推薦閱讀第一篇文章中演示了快速生成測(cè)試類(lèi)的方法,可以去看看,生成的測(cè)試類(lèi)都是以Test結(jié)尾的

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

      pom.xml詳解

      groupId 公司域名倒過(guò)來(lái) artifactId 功能命名 version 版本號(hào)

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

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

      scope詳解

      參數(shù)

      解釋

      是否會(huì)被打入最終的jar包

      compile

      默認(rèn)的scope

      test

      測(cè)試使用

      provided

      編譯需要

      runtime

      編譯不需要,運(yùn)行時(shí)需要(接口與實(shí)現(xiàn)分離)

      system

      加載本地jar

      類(lèi)似如下這種,沒(méi)有指定scope,說(shuō)明scope是compile

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

      test是指在運(yùn)行測(cè)試用例的時(shí)候才會(huì)用到,沒(méi)必要打入到最后的jar里面,所以你看到的測(cè)試框架的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)行,首先得加入如下依賴(lài)

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

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

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

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

      我寫(xiě)了如下一個(gè)測(cè)試類(lèi)

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

      生成的class文件反編譯后的如下,驗(yàn)證了我們的想法,編譯之后確實(shí)沒(méi)有必要再用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ù)庫(kù)的操作,但沒(méi)有加入相應(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到本地倉(cāng)庫(kù)
      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)說(shuō)到scope為system的依賴(lài)不會(huì)被打入最終的jar包,得通過(guò)配置插件等方式將依賴(lài)打入最終的jar包,所以這種方式一般很少使用。

      Maven jar包沖突如何解決?

      依賴(lài)傳遞

      假設(shè)我們現(xiàn)在有一個(gè)多模塊項(xiàng)目,依賴(lài)關(guān)系如圖,我們?cè)趕t-web模塊中引入st-dal依賴(lài)時(shí),st-common-lib這個(gè)依賴(lài)也會(huì)被我們引入,這個(gè)就是依賴(lài)傳遞,下表中列出了scope在依賴(lài)過(guò)程中發(fā)生的變化,列標(biāo)題為被依賴(lài)的模塊的scope

      compile

      test

      provided

      runtime

      compile

      compile

      -

      -

      runtime

      test

      test

      -

      -

      test

      provided

      provided

      -

      provided

      provided

      runtime

      runtime

      -

      -

      runtime

      依賴(lài)仲裁

      依賴(lài)仲裁就是當(dāng)項(xiàng)目中引入的jar包,groupId (公司域名倒過(guò)來(lái))和artifactId (功能命令)一樣,但是version不一樣,應(yīng)該選用哪一個(gè)version?也經(jīng)常被人叫做依賴(lài)沖突

      最短路徑原則

      假如說(shuō)我們現(xiàn)在的項(xiàng)目依賴(lài)關(guān)系如圖?那么maven會(huì)選用st-common-lib的那個(gè)版本呢?

      答案是1.1這個(gè)版本,st-web到st-common-lib(1.1)的距離為1,st-web到st-common-lib(1.0)的距離為2,選擇距離短的,即最短路徑原則

      如何看依賴(lài)的距離關(guān)系呢?前文說(shuō)過(guò),執(zhí)行如下命令打印出全局的依賴(lài)樹(shù),層級(jí)關(guān)系特別清楚

      mvn dependency:tree > show.txt 

      聲明優(yōu)先原則

      項(xiàng)目依賴(lài)如圖,路徑一樣,會(huì)選用st-common-lib的哪個(gè)版本呢?這就得看你在pom文件中先聲明是哪個(gè)依賴(lài),如果在pom.xml中,st-remote-invoker寫(xiě)在前面,就會(huì)用1.0這個(gè)版本,如果st-dal寫(xiě)在前面,則會(huì)用1.1這個(gè)版本

      依賴(lài)排除

      去掉間接引入的jar包

      如不想用spring boot默認(rèn)提供的log,想集成第三方的log時(shí),或者說(shuō)上面依賴(lài)仲裁的第二個(gè)例子中,只想用st-common-lib的1.1版本,就可以把1.0版本排除掉

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-logging</artifactId>
              </exclusion>
          </exclusions>
      </dependency>

      (完)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多