<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      深入了解gradle和maven的區別

      簡介

      gradlemaven都可以用來構建java程序,甚至在某些情況下,兩者還可以互相轉換,那么他們兩個的共同點和不同點是什么?我們如何在項目中選擇使用哪種技術呢?

      gradle和maven的比較

      雖然gradle和maven都可以作為java程序的構建工具。但是兩者還是有很大的不同之處的。我們可以從下面幾個方面來進行分析。

      可擴展性

      1. gradle較于maven相比,靈活性要更加好一點;

      基本的原因在于gradle使用的是groovy或者kotlin語言作為腳本的編寫語言,這樣極大的提高了腳本的靈活性,但是其本質上的原因是gradle的基礎架構能夠支持這種靈活性。
      可以使用gradle來構建native的C/C++程序,甚至擴展到任何語言的構建。

      1. maven相比于gradle而言,靈活性就要差上許多,但可讀性要好上許多

      maven項目容易看懂,方便上手。
      綜上所述,項目沒有太多自定義構建需求的話還是推薦使用maven,但是如果有相關需求,那么gradle還是更為合適一點。

      性能

      在性能方面,中小型項目對于內存而言影響不是很大,但如果說需要構筑大型項目,那么性能問題就要需要考慮進去了。
      對于大型項目來說,一次構建可能會需要很長的時間,尤其對于自動化構建和CI(Continuous Integration 持續集成)的環境來說,當然希望這個構建是越快越好。

      Gradle和Maven都支持并行的項目構建和依賴解析。但是gradle的三個特點讓gradle可以跑的比maven快上一點:

      1. 增量構建

      gradle為了提升構建的效率,提出了增量構建的概念,為了實現增量構建,gradle將每一個task都分成了三部分,分別是input輸入,任務本身和output輸出。下圖是一個典型的java編譯的task。

      以上圖為例,input就是目標jdk的版本,源代碼等信息,output就是編譯出來的class文件。
      增量構建的原理就是監控input的變化,只有input發送變化了,才重新執行task任務,否則gradle認為可以重用之前的執行結果。
      所以在編寫gradle的task的時候,需要指定task的輸入和輸出。
      并且要注意只有會對輸出結果產生變化的才能被稱為輸入,如果你定義了對初始結果完全無關的變量作為輸入,則這些變量的變化會導致gradle重新執行task,導致了不必要的性能的損耗。
      還要注意不確定執行結果的任務,比如說同樣的輸入可能會得到不同的輸出結果,那么這樣的任務將不能夠被配置為增量構建任務。

      作者:程序那些事
      鏈接:https://juejin.cn/post/6927479970243543054
      來源:稀土掘金
      著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

      1. 構建緩存

      gradle可以重用同樣input的輸出作為緩存。
      在同一個機子上的構建緩存和增量編譯是一個意思,但如果不是同一臺機器的情況,Cache緩存可以跨機器共享。如果是在一個CI服務的話,build cache將會非常有用。因為developer的build可以直接從CI服務器上面拉取構建結果,非常的方便。

      1. Gradle守護進程

      gradle會開啟一個守護進程來和各個build任務進行交互,優點就是不需要每次構建都初始化需要的組件和服務。
      因為守護進程是一個一直運行的進程,所以除了可以避免每次JVM啟動的開銷之外,還可以緩存項目結構,文件,task和其他的信息,從而提升運行速度。

      可以運行 gradle --status 來查看正在運行的daemons進程。

      從Gradle 3.0之后,daemons是默認開啟的,你可以使用 org.gradle.daemon=false 來禁止daemons。

      我們可以通過下面的幾個圖來直觀的感受一下gradle和maven的性能比較:

      • 使用gradle和maven構建 Apache Commons Lang 3的比較:

      • 使用gradle和maven構建小項目(10個模塊,每個模塊50個源文件和50個測試文件)的比較:

      • 使用gradle和maven構建大項目(500個模塊,每個模塊100個源文件和100個測試文件)的比較:


      可以看到gradle性能的提升是非常明顯的。

      作者:程序那些事
      鏈接:https://juejin.cn/post/6927479970243543054
      來源:稀土掘金
      著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

      兩者依賴區分:

      相同點:gradle和maven都可以本地緩存依賴文件,并且都支持依賴文件的并行下載;
      不同點:maven項目通過版本號來覆蓋一個依賴項;gradle可以通過自定義依賴關系和替換規則來進行構筑,以此來構筑更為大體量的項目。

      從Maven遷移Gradle

      maven出現的時間比較早,基本上所有的java項目都支持maven,相比而言gradle的市場使用量就要少些。想在要說的就是把maven項目遷移到gradle的想法:
      gradle和maven從本質上來說就是不同的:
      gradle通過task的DAG圖來組織任務;
      maven則是通過attach到phases的goals來執行任務。
      雖然兩者的構建有很大的不同,但是得益于gradle和maven相識的各種約定規則,從maven移植到gradle并不是難事。

      1. 要想從maven移植到gradle,首先要了解下maven的build生命周期,

      maven的生命周期包含了clean,compile,test,package,verify,install和deploy這幾個phase。

      1. 需要將maven的生命周期phase轉換為gradle的生命周期task。

      使用gradle的Base Plugin,Java Plugin和Maven Publish Plugin。

      引入這plugin:

      plugins {
          id 'base'
          id 'java'
          id 'maven-publish'
      }
      

      生命周期轉換:

      MavenGradle
      cleanclean task
      compileclasses task
      testtest task
      packageassemble task
      verifycheck task
      installMaven Publish Plugin > publishToMavenLocal task
      deployMaven Publish Plugin > publish task

      有了這些task之間的對應關系
      我們就可以嘗試進行maven到gradle的轉換了。

      自動轉換

      我們除了可以使用 gradle init 命令來創建一個gradle的架子之外,還可以使用這個命令來將maven項目轉換成為gradle項目,gradle init命令會去讀取pom文件,并將其轉換成為gradle項目。

      轉換依賴

      gradle和maven的依賴都包含了group ID, artifact ID 和版本號。兩者本質上是一樣的,只是形式不同,

      <dependencies>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.12</version>
        </dependency>
      </dependencies>
      
      dependencies {
      	implementation 'log4j:log4j:1.2.12'  
      }
      

      gradlemaven寫起來要簡單。
      這里的implementation實際上是由 Java Plugin 來實現的。

      我們在maven的依賴中有時候還會用到scope選項,用來表示依賴的范圍:

      • compile:

      在gradle可以有兩種配置來替換compile,我們可以使用implementation或者api
      implementation在任何使用Java Plugin的gradle中都可以使用;
      api只能在使用Java Library Plugin的項目中使用。
      兩者是有區別的,分場景進行使用:
      如果是構建應用程序或者webapp,推薦使用implementation
      如果是在構建Java libraries,那么推薦使用api

      • runtime:

      可以替換成 runtimeOnly

      • test:

      gradle中的test分為兩種,一種是編譯test項目的時候需要,那么可以使用testImplementation,一種是運行test項目的時候需要,那么可以使用testRuntimeOnly

      • provided:

      可以替換成為compileOnly

      • import:

      在maven中,import經常用在dependencyManagement中,通常用來從一個pom文件中導入依賴項,從而保證項目中依賴項目版本的一致性。
      在gradle中,可以使用 platform() 或者 enforcedPlatform() 來導入pom文件:

      dependencies {
      	implementation platform('org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE') 
      
      	implementation 'com.google.code.gson:gson' 
          implementation 'dom4j:dom4j'
      }
      

      比如上面的例子中,我們導入了spring-boot-dependencies。因為這個pom中已經定義了依賴項的版本號,所以我們在后面引入gson的時候就不需要指定版本號了。
      **platform****enforcedPlatform**的區別在于,enforcedPlatform會將導入的pom版本號覆蓋其他導入的版本號:

      dependencies {
      // import a BOM. The versions used in this file will override any other version found in the graph
      implementation enforcedPlatform('org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE')
      
      // define dependencies without versions
      implementation 'com.google.code.gson:gson'
      implementation 'dom4j:dom4j'
      
      // this version will be overridden by the one found in the BOM
      implementation 'org.codehaus.groovy:groovy:1.8.6'
      }
      

      轉換repositories倉庫

      gradle可以兼容使用maven或者lvy的repository。gradle沒有默認的倉庫地址,所以你必須手動指定一個。
      可以在gradle使用maven的倉庫:

      repositories {
          mavenCentral()
      }
      

      我們還可以直接指定maven倉庫的地址:

      repositories {
      maven {
          url "http://repo.mycompany.com/maven2"
      }
      }
      

      如果你想使用maven本地的倉庫,則可以這樣使用:

      repositories {
          mavenLocal()
      }
      

      但是mavenLocal是不推薦使用的:

      1. mavenLocal只是maven在本地的一個cache,它包含的內容并不完整。
      2. 一個本地的maven repository module可能只包含了jar包文件,并沒有包含source或者javadoc文件。我們將不能夠在gradle中查看這個module的源代碼,因為gradle會首先在maven本地的路徑中查找這個module。
      3. 本地的repository是不可信任的,因為里面的內容可以輕易被修改,并沒有任何的驗證機制。

      控制依賴的版本

      如果同一個項目中對同一個模塊有不同版本的兩個依賴的話,默認情況下Gradle會在解析完DAG之后,選擇版本最高的那個依賴包。
      但是這樣做并不一定就是正確的, 所以我們需要自定義依賴版本的功能。
      首先就是上面我們提到的使用platform()和enforcedPlatform() 來導入BOM(packaging類型是POM的)文件。
      如果我們項目中依賴了某個module,而這個module又依賴了另外的module,我們叫做傳遞依賴。在這種情況下,如果我們希望控制傳遞依賴的版本,比如說將傳遞依賴的版本升級為一個新的版本,那么可以使用dependency constraints:

      dependencies {
      implementation 'org.apache.httpcomponents:httpclient'
      constraints {
          implementation('org.apache.httpcomponents:httpclient:4.5.3') {
              because 'previous versions have a bug impacting this application'
          }
          implementation('commons-codec:commons-codec:1.11') {
              because 'version 1.9 pulled from httpclient has bugs affecting this application'
          }
          }
      }
      

      注意:dependency constraints只對傳遞依賴有效,如果上面的例子中commons-codec并不是傳遞依賴,那么將不會有任何影響。

      Dependency constraints需要Gradle Module Metadata的支持,只有module是發布在gradle中才支持這個特性,如果是發布在maven或者ivy中是不支持的。
      上面講的是傳遞依賴的版本升級。


      同樣是傳遞依賴,如果本項目也需要使用到這個傳遞依賴的module,但是需要使用到更低的版本(因為默認gradle會使用最新的版本),就需要用到版本降級了。

      dependencies {
      implementation 'org.apache.httpcomponents:httpclient:4.5.4'
      implementation('commons-codec:commons-codec') {
              version {
              	strictly '1.9'
          	}
      	}
      }
      

      我們可以在implementation中指定特定的version即可。
      strictly:表示的是強制匹配特定的版本號,除了strictly之外,還有require。
      require:表示需要的版本號大于等于給定的版本號。
      prefer:如果沒有指定其他的版本號,那么就使用prefer這個。
      reject:拒絕使用這個版本。
      Java Platform Plugin:指定特定的platform,從而限制版本號。
      最后看一下如何exclude一個依賴:

      dependencies {
          implementation('commons-beanutils:commons-beanutils:1.9.4') {
          exclude group: 'commons-collections', module: 'commons-collections'
      }
      }
      

      多模塊項目

      maven中可以創建多模塊項目:

      <modules>
        <module>simple-weather</module>
        <module>simple-webapp</module>
      </modules>
      

      我們可以在gradle中做同樣的事情settings.gradle:

      rootProject.name = 'simple-multi-module'  
      include 'simple-weather', 'simple-webapp'
      

      profile和屬性

      maven中可以使用profile來區別不同的環境,在gradle中,我們可以定義好不同的profile文件,然后通過腳本來加載他們:
      build.gradle:

      if (!hasProperty('buildProfile')) ext.buildProfile = 'default'  
      
          apply from: "profile-${buildProfile}.gradle"  
      
      task greeting {
          doLast {
          println message  
      }
      }
      

      profile-default.gradle:

      ext.message = 'foobar'
      

      profile-test.gradle:

      ext.message = 'testing 1 2 3'
      

      我們可以這樣來運行:

      > gradle greeting
      foobar
      
      > gradle -PbuildProfile=test greeting
      testing 1 2 3
      

      資源處理

      在maven中有一個process-resources階段,可以執行resources:resources用來進行resource文件的拷貝操作。
      在Gradle中的Java plugin的processResources task也可以做相同的事情。
      比如我可以執行copy任務:

      task copyReport(type: Copy) {
          from file("$buildDir/reports/my-report.pdf")
          into file("$buildDir/toArchive")
      }
      

      更加復雜的拷貝:

      task copyPdfReportsForArchiving(type: Copy) {
          from "$buildDir/reports"
          include "*.pdf"
          into "$buildDir/toArchive"
      }
      

      當然拷貝還有更加復雜的應用。這里就不詳細講解了。

      posted @ 2024-01-30 20:58  柯基大大  閱讀(17)  評論(0)    收藏  舉報  來源
      主站蜘蛛池模板: 无套内谢少妇一二三四| 日韩av在线不卡一区二区三区| 宜都市| 人妻系列无码专区免费| 久久人人97超碰人人澡爱香蕉| 日韩精品亚洲 国产| 久久视频在线视频| 定安县| 国产在线精品一区二区三区不卡| 免费视频一区二区三区亚洲激情| 国产成人精彩在线视频| 中文亚洲成A人片在线观看| 北安市| 亚洲国产精品特色大片观看完整版 | 亚洲精品成人片在线观看精品字幕| 日韩精品区一区二区三vr| 国产精品欧美福利久久| 人妻色综合网站| 欧美精品18videosex性欧美| 国产伦一区二区三区视频| 99视频30精品视频在线观看| 日韩欧美卡一卡二卡新区| 又大又粗欧美成人网站| 亚洲成在人线AV品善网好看| 无码高潮爽到爆的喷水视频app | 人妻精品中文字幕av| 国产成人无码aa片免费看| 麻豆亚州无矿码专区视频| 亚洲 欧洲 无码 在线观看| 亚洲熟妇av一区二区三区宅男| 看亚洲黄色不在线网占| 叙永县| 亚洲精品成人综合色在线| 综合色一色综合久久网| 亚欧洲乱码视频在线专区| 久久婷婷成人综合色| 国产99在线 | 亚洲| 国产在线一区二区不卡| 无码日韩精品一区二区人妻| 久热这里只有精品12| 日韩一区二区三区精彩视频|