<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          不好意思, Maven 該換了!

          共 6642字,需瀏覽 14分鐘

           ·

          2022-07-23 16:31

          往期熱門文章:

          1、這是我見過寫得最爛的Controller層代碼,沒有之一!

          2、聊聊接口優(yōu)化的幾種方法

          3、3 步完成 Spring Boot 的日志脫敏

          4、線上MySQL的自增id用盡怎么辦?被面試官干趴下了!

          5、求求你別再用 System.currentTimeMillis() 統(tǒng)計代碼耗時了,真的太 Low 了!

          來源:toutiao.com/i6824937779193971207

          相信使用Java的同學(xué)都用過Maven,這是一個非常經(jīng)典好用的項目構(gòu)建工具。但是如果你經(jīng)常使用Maven,可能會發(fā)現(xiàn)Maven有一些地方用的讓人不太舒服:

          1. Maven的配置文件是XML格式的,假如你的項目依賴的包比較多,那么XML文件就會變得非常非常長;

          2. XML文件不太靈活,假如你需要在構(gòu)建過程中添加一些自定義邏輯,搞起來非常麻煩;

          3. Maven非常的穩(wěn)定,但是相對的就是對新版java支持不足,哪怕就是為了編譯java11,也需要更新內(nèi)置的Maven插件。

          如果你對Maven的這些缺點也有所感觸,準(zhǔn)備嘗試其他的構(gòu)建工具,那么你可以試試gradle,這是一個全新的java構(gòu)建工具,解決了Maven的一些痛點。

          一、安裝Gradle

          最傳統(tǒng)的安裝方法就是去gradle官網(wǎng)下載二進(jìn)制包,解壓,然后將路徑添加到環(huán)境變量中。如果你沒什么其他需求,可以使用這種安裝方式。但是,gradle是一個非常新潮的項目,每隔幾個月就會發(fā)布一個新版本,這種方式可能跟不上gradle的更新速度。

          所以我更加推薦使用包管理器來安裝gradle。如果你使用linux系統(tǒng),那么不必多說。如果你使用Windows系統(tǒng),我推薦使用scoop包管理器來安裝gradle。它安裝方便,而且使用SHIM目錄來管理環(huán)境變量,在各種工具中配置gradle也很方便。

          當(dāng)然,如果你完全不喜歡安裝這么多亂七八糟的東西,那也可以使用gradle。gradle提供了一個名為gradle wrapper的工具,可以在沒有安裝gradle的情況下使用gradle。好吧,其實它就是個腳本文件,當(dāng)你運行wrapper腳本的時候,如果腳本發(fā)現(xiàn)你電腦里沒有g(shù)radle,就會自動替你下載安裝一個。現(xiàn)在甚至還出現(xiàn)了Maven wrapper,也是個腳本文件,可以自動安裝Maven。

          之前相信一些朋友聽說過gradle,然后嘗試使用它,結(jié)果因為速度太慢,最后放棄了。之前我也因為gradle的速度,放棄了它一段時間。不過現(xiàn)在使用gradle的話會方便很多。gradle官方在中國開設(shè)了,CDN,使用gradle wrapper的時候下載速度非常快。可以說現(xiàn)在是一個學(xué)習(xí)使用gradle的好時候。

          二、使用gradle wrapper

          這里我使用的IDEA來創(chuàng)建和使用gradle項目。

          IDEA默認(rèn)就會使用gradle wrapper來創(chuàng)建項目,所以無需安裝gradle也可以正常運行。這時候項目結(jié)構(gòu)應(yīng)該類似下圖所示,使用Maven的同學(xué)應(yīng)該比較熟悉,因為這和Maven的項目結(jié)構(gòu)幾乎完全一致。gradle文件夾和gradlew那幾個文件就是gradle wrapper的文件,而.gradle后綴名的文件正是gradle的配置文件,對應(yīng)于Maven的pom.xml。

          gradle wrapper的優(yōu)點之一就是可以自定義下載的gradle的版本,如果是團(tuán)隊協(xié)作的話,這個功能就非常方便,簡單設(shè)置即可統(tǒng)一團(tuán)隊的構(gòu)建工具版本。這里我就設(shè)定成目前最新的gradle 6.4.默認(rèn)下載安裝的是bin版,僅包含二進(jìn)制。如果你使用IDEA的話,它會推薦下載all版,包含源代碼,這樣IDEA就可以分析源代碼,提供更加精確的gradle腳本支持。

          三、依賴管理

          下面來看看gradle的依賴管理功能,這也算是我們使用構(gòu)建工具的主要目的之一了。這點也是gradle相較maven的優(yōu)勢之一了。相較于maven一大串的XML配置,gradle的依賴項僅需一行。

          dependencies {
             testImplementation 'junit:junit:4.13'
             implementation 'com.google.code.gson:gson:2.8.6'
          }

          這里推薦一下Jetbrains的package search網(wǎng)站,是尋找maven和gradle依賴包的最佳網(wǎng)站,可以非常輕松的搜索和使用依賴項。

          gradle依賴的粒度控制相較于Maven也更加精細(xì),maven只有compile、provided、test、runtime四種scope,而gradle有以下幾種scope:

          1.implementation,默認(rèn)的scope。implementation的作用域會讓依賴在編譯和運行時均包含在內(nèi),但是不會暴露在類庫使用者的編譯時。舉例,如果我們的類庫包含了gson,那么其他人使用我們的類庫時,編譯時不會出現(xiàn)gson的依賴。

          2.api,和implementation類似,都是編譯和運行時都可見的依賴。但是api允許我們將自己類庫的依賴暴露給我們類庫的使用者。

          3.compileOnly和runtimeOnly,這兩種顧名思義,一種只在編譯時可見,一種只在運行時可見。而runtimeOnly和Maven的provided比較接近。

          4.testImplementation,這種依賴在測試編譯時和運行時可見,類似于Maven的test作用域。

          5.testCompileOnly和testRuntimeOnly,這兩種類似于compileOnly和runtimeOnly,但是作用于測試編譯時和運行時。

          通過簡短精悍的依賴配置和多種多樣的作用與選擇,Gradle可以為我們提供比Maven更加優(yōu)秀的依賴管理功能。

          四、gradle的任務(wù)和插件

          gradle的配置文件是一個groovy腳本文件,在其中我們可以以編程方式自定義一些構(gòu)建任務(wù)。因為使用了編程方式,所以這帶給了我們極大的靈活性和便捷性。打個比方,現(xiàn)在有個需求,要在打包出jar的時候順便看看jar文件的大小。在gradle中僅需在構(gòu)建腳本中編寫幾行代碼即可。而在Maven中則需要編寫Maven插件,復(fù)雜程度完全不在一個水平。

          當(dāng)然,Maven發(fā)展到現(xiàn)在,已經(jīng)存在了大量的插件,提供了各式各樣的功能可以使用。但是在靈活性方面還是無法和Gradle相比。而且Gradle也有插件功能,現(xiàn)在發(fā)展也十分迅猛,存在了大量非常好用的插件,例如gretty插件。gretty原來是社區(qū)插件,后來被官方吸收為官方插件,可以在Tomcat和jetty服務(wù)器上運行web項目,比Maven的相關(guān)插件功能都強(qiáng)大。

          雖然gradle可以非常靈活的編寫自定義腳本任務(wù),但是其實一般情況下我們不需要編寫構(gòu)建腳本,利用現(xiàn)有的插件和任務(wù)即可完成相關(guān)功能。在IDEA里,也可以輕松的查看當(dāng)前gradle項目中有多少任務(wù),基本任務(wù)如build、test等Maven和Gradle都是相通的。

          五、配置鏡像

          Maven官方倉庫的下載速度非常慢,所以一般我們要配置國內(nèi)的鏡像源。gradle在這方面和Maven完全兼容,因此只需稍微配置一下鏡像源,即可使用Maven的鏡像。如果你用gradle構(gòu)建過項目,應(yīng)該就可以在用戶目錄的.gradle文件夾下看到gradle的相關(guān)配置和緩存。

          之前wrapper下載的gradle也存放在該文件夾下,位置是wrapper/dists。

          而依賴的本地緩存在caches\modules-2\files-2.1文件夾下。目錄結(jié)構(gòu)和Maven的本地緩存類似,都是包名+版本號的方式,但是gradle的目錄結(jié)構(gòu)最后一層和Maven不同,這導(dǎo)致它們無法共用本地緩存。

          言歸正傳,在gradle中配置下載鏡像需要在.gradle文件夾中直接新建一個init.gradle初始化腳本,腳本文件內(nèi)容如下。這樣一來,gradle下載鏡像的時候就會使用這里配置的鏡像源下載,速度會快很多。再加上gradle wrapper在中國設(shè)置了CDN,現(xiàn)在使用gradle的速度應(yīng)該會很快。

          allprojects {
             repositories {
                 maven {
                     url "https://maven.aliyun.com/repository/public"
                 }
                 maven {
                     url "https://maven.aliyun.com/repository/jcenter"
                 }
                 maven {
                     url "https://maven.aliyun.com/repository/spring"
                 }
                 maven {
                     url "https://maven.aliyun.com/repository/spring-plugin"
                 }
                 maven {
                     url "https://maven.aliyun.com/repository/gradle-plugin"
                 }
                 maven {
                     url "https://maven.aliyun.com/repository/google"
                 }
                 maven {
                     url "https://maven.aliyun.com/repository/grails-core"
                 }
                 maven {
                     url "https://maven.aliyun.com/repository/apache-snapshots"
                 }
             }
          }

          當(dāng)然,如果你有代理的話,其實我推薦你直接為gradle設(shè)置全局代理。因為gradle腳本實在是太靈活了,有些腳本中可能依賴了github或者其他地方的遠(yuǎn)程腳本。這時候上面設(shè)置的下載鏡像源就不管用了。

          所以有條件還是干脆直接使用全局代理比較好。設(shè)置方式很簡單,在.gradle文件夾中新建gradle.properties文件,內(nèi)容如下。中間幾行即是設(shè)置代理的配置項。當(dāng)然其他幾行我也建議你設(shè)置一下,把gradle運行時的文件編碼設(shè)置為UTF8,增加跨平臺兼容性。

          org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
          systemProp.http.proxyHost=127.0.0.1
          systemProp.http.proxyPort=10800
          systemProp.https.proxyHost=127.0.0.1
          systemProp.https.proxyPort=10800
          systemProp.file.encoding=UTF-8
          org.gradle.warning.mode=all

          六、為什么使用gradle?

          看到這里,你應(yīng)該對gradle有了基本的了解, 也可以將其用于你的項目之中。但是如果你Maven已經(jīng)非常熟悉了,可能不太愿意使用gradle,因為貌似沒有必要。但是既然gradle出現(xiàn)了,就說明有很多人對Maven還是有一定的意見。因此在這里我來總結(jié)一下gradle相比maven的優(yōu)勢。

          1. 速度,gradle使用構(gòu)建緩存、守護(hù)進(jìn)程等方式提高編譯速度。結(jié)果就是gradle的編譯速度要遠(yuǎn)超maven,平均編譯速度比Maven快好幾倍,而且項目越大,這個差距就越明顯。

          2. 靈活性,gradle要比Maven靈活太多,雖然有時候靈活并不是一件好事情。但是大部分情況下,靈活一點可以極大的方便我們。Maven死板的XML文件方式做起事情來非常麻煩。很多Maven項目都通過執(zhí)行外部腳本的方式來完成一些需要靈活性的工作。而在gradle中配置文件就是構(gòu)建腳本,構(gòu)建腳本就是編程語言(groovy編程語言),完全可以自給自足,無需外部腳本。


          3. 簡潔性完成同樣的功能,gradle腳本的長度要遠(yuǎn)遠(yuǎn)短于maven配置文件的長度。雖然很多人都說XML維護(hù)起來不麻煩,但是我覺得,維護(hù)一個光是依賴就有幾百行的XML文件,不見得就比gradle腳本簡單。


          也許是因為我上面說的原因,也許有其他原因,不得不承認(rèn)的一件事情就是gradle作為一個新興的工具已經(jīng)有了廣泛的應(yīng)用。spring等項目已經(jīng)從Maven切換到了gradle。開發(fā)安卓程序也只支持gradle了。因此不管是否現(xiàn)在需要將項目從maven切換到gradle,但是至少學(xué)習(xí)gradle是一件必要的事情。


          往期熱門文章:

          1、線上MySQL的自增id用盡怎么辦?被面試官干趴下了!
          2、計算機(jī)專業(yè)會不會成為下一個土木?
          3、xxl-job驚艷的設(shè)計,怎能叫人不愛
          4、ArrayList#subList這四個坑,一不小心就中招
          5、面試官:大量請求 Redis 不存在的數(shù)據(jù),從而影響數(shù)據(jù)庫,該如何解決?
          6、MySQL 暴跌!
          7、超越 Xshell!號稱下一代 Terminal 終端神器,用完愛不釋手!
          8、IDEA 官宣全新默認(rèn) UI,太震撼了!!
          9、讓你直呼「臥槽」的 GitHub 項目!
          10、Kafka又笨又重,為啥不選Redis?

          瀏覽 28
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰人人艹 | 男女操逼视频网站入口免费观看1草溜 | 精品乱子伦一区二区三区在线播放 | 一极毛片| 操逼亚州 |