日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kafka maven没有下载_构建工具的进化:ant, maven, gradle

發布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kafka maven没有下载_构建工具的进化:ant, maven, gradle 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在講解基礎知識的過程中,我們也要動手去寫。而Java發展到現在,可以幫助我們寫程序,構建,發布的工具有一大堆。今天就來討論一下構建工具。在開始之前,我們先講點別的。

如何學習琳瑯滿目的框架和工具

學Java的新人,最頭疼的事情,莫過于工具太多,挑花了眼。不管你要做什么,幾乎都要面臨各種各樣的選擇。我是應該選hibernate呢?還是mybatis。我新建一個工程,要不要加上spring?mvc, tx都是什么?tomcat,jetty是什么?網絡編程要不要用netty?要在服務端布署多個機器,用akka行不行?DMQ呢?protobuf是什么鬼?類似的問題還有很多。

如果利用搜索引擎,想去看看這些工具分別是干嘛的,會發現,搜索結果五花八門,說什么的都有,甚至有些說法都相互矛盾。造成這些亂象的原因,一是Java的應用過于廣泛,在不同的軟件體系中都能看到Java的身影,而不同的需求,會使用不同的工具,甚至是同樣的工具,在不同的環境下,都會有不同的用法。二是,Java的流行已經有很長時間了,隨著時間的推移,肯定會有很多工具沒有跟上歷史的潮流而慢慢被淘汰。比如J2EE現在的市場占有率只有不足5%。再比如java swing的圖形界面編程,現在幾乎沒有公司再使用swing進行圖形界面編程了,最早,互聯網公司就幾乎沒有采用過swing的方案。swing只在某些企業級軟件里發揮作用,而隨著HTML5的興起,越來越多的軟件公司也把自己的界面搬到web前端,現在的html5對2d, 3d都有非常好的支持,而一套簡潔的CSS就能定制出漂亮的界面。所以swing被html5擠出歷史進程實屬正常。再比如JSF,JavaFX等等,也算是出師未捷身先死。有用的,沒用的一堆堆地都堆到新手面前,新手的感覺肯定就是“那叫一個亂”啊。

說到這里,吐槽一下,某些培訓機構和出版機構。為了湊篇幅,還會把一些已經不常用的技術加上,這就給新手們,尤其是自學的新手們帶來誤導,以為這些東西很重要。例如《Java核心技術》這本書的第一卷里,還為swing準備了大段的篇幅,甚至還有awt,而這些東西早就不應該被列入學習計劃了。這一點《Java編程思想》會好一點,在第4版里,圖形界面編程已經壓縮到最后一章了,做為參考提醒一下讀者,Java里還有這么個玩意。

關于這些框架,工具的學習,我這里有一個建議:什么都別學,從基礎開始,把根基搞扎實了。然后自己動手做工程,遇到問題了,再去學習會更好。我覺得一個好的老師,不是手把手地把知識教給你,而是能夠指出問題的所在。我舉一個例子。我之前指導過一個師弟學習Java,我讓他自己用socket寫一個web server ,他使用了一個線程一個連接的原始的線程方案,并且使用本機測試,開了十來個客戶端,覺得還不錯。我就告訴他,你這樣的測試是不對的,你要去找一個client端的benchmark,或者自己寫個工具,創建成百上千個連接,然后再看看你的web server的表現如何。后來,他發現,當創建幾百個連接以后,服務端幾乎就跑不動了。然后,我就提醒他,可以考慮一下,業界有哪些解決方案。這時候,他找到了nio,netty, 線程池等等方案。然后自己去重構,重構過程中,發現邏輯和頁面合在一起,很難處理,又引入了spring mvc,為了操作數據庫,又引入了hibernate等等。

回顧他學習的過程可以發現,對于工具和框架,被動地學習會比主動地學習效果好。到了不得不學的時候再去學習,有具體的場景,學起來必然事半功倍。我再舉一個例子,上次在北京和朋友一起吃飯,他抱怨說Java不好招。我說,北京那么多培訓班,新人一把一把地,不是隨便招嗎?他就講了自己的面試經歷。有一個小伙子,簡歷上寫了熟悉servlet, spring,ibatis等框架。他就和這個小伙子聊怎么用這些框架,小伙子答的還可以。然后他就問到了http協議和Java中的Proxy(這是實現Spring的核心機制)以及reflection,小伙子就答不上來了。這就有點舍本逐末了,且不說,是不是所有公司都會使用spring,就算spring是標準配置,被寫到Java語言標準中去,那也不能基礎太薄弱了,出了詭異BUG,都不知道怎么查。框架這個東西,遇到問題再去學吧,如果你跟著框架走,三天兩頭有新的東西出來,你只能疲于奔命。今天出個rabbitmq,你要學,明天出個kafka,你還要學,沒準哪天又出來個什么樣的新DMQ,你還是得學。這學到什么時候是個頭了。

回到今天的主題,我們討論三個構建工程用的工具。

構建工具

我們要寫一個Java程序,一般的步驟也就是編譯,測試,打包。這個構建的過程,如果文件比較少,我們可以手動使用java, javac, jar命令去做這些事情。但當工程越來越大,文件越來越多,這個事情就不是那么地令人開心了。因為這些命令往往都是很機械的操作。但是我們可以把機械的東西交給機器去做。

在linux上,有一個工具叫make。我們可以通過編寫Makefile來執行工程的構建。windows上相應的工具是nmake。這個工具寫起來比較羅嗦,所以從早期,Java的構建就沒有選擇它,而是新建了一個叫做ant的工具。ant的思想和makefile比較像。定義一個任務,規定它的依賴,然后就可以通過ant來執行這個任務了。我們通過例子看一下。下面列出一個ant工具所使用的build.xml:

<?xml version="1.0" encoding="UTF-8" ?> <project name="HelloWorld" default="run" basedir="."> <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="jarfile" value="hello.jar"/> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target> <target name="build" depends="compile"> <jar jarfile="${jarfile}" basedir="${dest}"/> </target> <target name="test" depends="build"> <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/> </target> <target name="clean"> <delete dir="${dest}" /> <delete file="${hello_jar}" /> </target> </project>

可以看到ant的構建腳本還是比較清楚的。ant定義了五個任務,init, compile, build, test, clean。每個任務做什么都定義清楚了。打包之前要先編譯,所以通過depends來指定依賴的路徑。如果在命令行里執行ant build,那就會先執行compile,而compile又依賴于init,所以就會先執行init。看起來很合理,對吧?有了這個東西以后,我們只要一條命令:

ant test

就可以執行編程,打包,測試了。為開發者帶來了很大的便利。

但是ant有一個很致命的缺陷,那就是沒辦法管理依賴。我們一個工程,要使用很多第三方工具,不同的工具,不同的版本。每次打包都要自己手動去把正確的版本拷到lib下面去,不用說,這個工作既枯燥還特別容易出錯。為了解決這個問題,maven閃亮登場。

maven最核心的改進就在于提出倉庫這個概念。我可以把所有依賴的包,都放到倉庫里去,在我的工程管理文件里,標明我需要什么什么包,什么什么版本。在構建的時候,maven就自動幫我把這些包打到我的包里來了。我們再也不用操心著自己去管理幾十上百個jar文件了。

這了達到這個目標,maven提出,要給每個包都標上坐標,這樣,便于在倉庫里進行查找。所以,使用maven構建和發布的包都會按照這個約定定義自己的坐標,例如:

<?xml version="1.0" encoding="utf-8"?>

這樣,我就定義了我自己的包的坐標是cn.hinus.recruit:Example:0.1.0-SNAPSHOT,而我的工程要依賴junit:junit:4.10。那么maven就會自動去幫我把junit打包進來。如果我本地沒有junit,maven還會幫我去網上下載。下載的地方就是遠程倉庫,我們可以通過repository標簽來指定遠程倉庫。

maven里拋棄了ant中通過target定義任務的做法,而是引入了生命周期的概念。這個問題要講下去,就是一個大的話題了。我們暫時放一下。因為我們要看今天的最終BOSS,gradle

Gradle

maven已經很好了,可以滿足絕大多數工程的構建。那為什么我們還需要新的構建工具呢?第一,maven是使用xml進行配置的,語法不簡潔。第二,最關鍵的,maven在約定優于配置這條路上走太遠了。就是說,maven不鼓勵你自己定義任務,它要求用戶在maven的生命周期中使用插件的方式去工作。這有點像設計模式中的模板方法模式。說通俗一點,就是我使用maven的話,想靈活地定義自己的任務是不行的。基于這個原因,gradle做了很多改進。

gradle并不是另起爐灶,它充分地使用了maven的現有資源。繼承了maven中倉庫,坐標,依賴這些核心概念。文件的布局也和maven相同。但同時,它又繼承了ant中target的概念,我們又可以重新定義自己的任務了。(gradle中叫做task)

我們來體驗一下,新建一個空目錄,在命令行,執行

gradle

可以看到新創建了一個工程,工程根目錄下,有這幾項:

build.gradle gradle settings.gradle src

我們看一下,build.gradle的內容:

// Apply the java plugin to add support for Java

內容很簡單,引入了java插件,指定倉庫,指定依賴。可以看到依賴的設定相比起xml的寫法,變得大大簡化了。

使用gradle,任務又變成了核心概念了。我們就來體驗一下任務。

在build.gradle里添加這樣的任務:

task hello << { println 'welcome to gradle'; }

然后在命令行執行

gradle -q hello

就可以看見打印一行"welcome to gradle"。在使用maven構建的時候,如果想臨時對某一個構建任務加一點log,會是個非常困難的事情 。但在gradle里,就變得非常簡單,因為gradle的背后其實是groovy這個編程語言在起作用。為了驗證這一點,我們再改一下:

task

然后執行gradle -q hello,就可以看到連續打印了三行。使用腳本語言進行構建,這幾乎給了我們任何的能力,我們可以在構建的時候做任何的事情,甚至你可以直接讓gradle幫你做表達式求值 :)

導入到 IDE

在Java的開發中,我們不可能脫離集成開發環境(Integrated Develop Environment)。因為IDE提供了代碼補全和方便的代碼跳轉,這是普通的文本編輯軟件(比如vim)很難做到的。所以我們還是要通過ide來進行代碼開發。

以前在ide里使用spring的時候,我們要手動下載spring的包,如果spring依賴了其他的第三方的庫,我們還要去下載那個庫并且添加到IDE中去。現在,我們就不必再這樣做了。只需要在build.gradle里定義好依賴,然后更新它,IDE就可以自動幫我們把包導進來。

例如,我要在新建的工程里使用spring,只需要在build.gradle里添加一行:

然后,在gradle窗口里,點擊更新:

然后,intellij就自動把spring所依賴的所有包都下載下來了。

非常方便。

好了,今天的課程就到這里了。作業:

使用gradle新建一個工程,并把它導入到你喜歡的IDE中去。添加spring依賴,并更新,觀察一下,gradle的工作方式。

小密圈《進擊的Java新人》中,有更詳細的內容,以及我已經建好的一個工程。已經加入小密圈的同學請去git上clone下來,我們接下來的課程會在這個工程上寫代碼咯。知乎專欄只負責講解知識,不負責指導動手。

上一節:進制習題課

下一節:Java中的設計模式:適配與裝飾

課程目錄:總目錄

總結

以上是生活随笔為你收集整理的kafka maven没有下载_构建工具的进化:ant, maven, gradle的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。