<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>

          IDEA跟Eclipse險(xiǎn)些打一架。Maven:都住手,我來(lái)一統(tǒng)天下

          共 6274字,需瀏覽 13分鐘

           ·

          2021-02-05 15:20

          往期熱門文章:

          1、往期精選優(yōu)秀博文都在這里了!
          2、Typora + GitHub = 效率
          3、女朋友為我寫了一個(gè)防猝死插件
          4、請(qǐng)謹(jǐn)慎使用Arrays.asList、ArrayList的subList
          5、全球頂級(jí)的14位程序員!膜拜!

          前言

          做Java開發(fā)這么久了,是否曾經(jīng)疑問(wèn)過(guò):

          1. 為何項(xiàng)目中的xxx.iml、.idea文件夾明明起到重要作用,卻不能被提交到git倉(cāng)庫(kù),否則工資容易受損呢?
          2. 這個(gè)項(xiàng)目他是用Eclipse開發(fā)的,我現(xiàn)在要用IDEA繼續(xù),擔(dān)心結(jié)構(gòu)上出現(xiàn)問(wèn)題?
          3. 為什么一個(gè)Maven項(xiàng)目被導(dǎo)入進(jìn)IDEA了能正常work,它的項(xiàng)目結(jié)構(gòu)Project Structure是咋樣的?

          若你也有這些疑問(wèn),那么看到本文你就來(lái)對(duì)了。

          IntelliJ IDEA和Eclipse作為當(dāng)下最為流行的兩大IDE,它們?cè)诮缑?、操作、?xiàng)目管理上是有很大差異的。正所謂兩派之爭(zhēng)必有一斗,到底該以誰(shuí)的項(xiàng)目結(jié)構(gòu)為標(biāo)準(zhǔn)?誰(shuí)又選擇去妥協(xié)呢?No,二者的答案都是這個(gè)

          本文提綱

          版本約定

          • IntelliJ IDEA:2020.3.2
          • SpringToolSuite:4.9.0.RELEASE

          正文

          接下來(lái)本文就從項(xiàng)目層面開始,探究這些問(wèn)題都是如何被解決的~

          IntelliJ IDEA項(xiàng)目

            Eclipse項(xiàng)目

            因?yàn)镋clipse項(xiàng)目本系列文章并未提及過(guò),所以這里簡(jiǎn)單的介紹下。

            實(shí)話說(shuō),A哥自2015年入行就從沒(méi)用過(guò)原生的eclipse,所以這里就以基于Eclipse的STS為例了哈,道理都一樣。

            Eclipse它有workspace操作空間的概念,所有Project項(xiàng)目都是放在操作空間里管理起來(lái)的。換句話講,Eclipse的一個(gè)窗口打開的是一整個(gè)工作空間,里面有多少Project就加載進(jìn)來(lái)多少個(gè),因此它可以實(shí)現(xiàn):一個(gè)窗口同時(shí)打開多個(gè)Project項(xiàng)目

            新建一個(gè)Project

            以新建一個(gè)名為hello的java項(xiàng)目為例:File -> New -> Java Project...

            習(xí)慣了IDEA的選手,看到這個(gè)eclipse的這個(gè)頁(yè)面,是否想感嘆一句:一個(gè)項(xiàng)目創(chuàng)建頁(yè)面為毛整這么復(fù)雜?像JRE、working sets這種選項(xiàng)完全沒(méi)必要在創(chuàng)建時(shí)讓選嘛,頁(yè)面太不精簡(jiǎn)了,干擾信息太多。

            點(diǎn)擊Next:

            呃,同樣的感覺(jué),且不說(shuō)是新手,即使是老手看到這個(gè)頁(yè)面也“亂花漸欲迷人眼”吧,O(∩_∩)O哈哈~。eclipse的頁(yè)面設(shè)計(jì)基本都有這個(gè)毛病:過(guò)于復(fù)雜,干擾選項(xiàng)太多。比如這里插一個(gè)class類的創(chuàng)建頁(yè)面,你感受一下:

            點(diǎn)擊Finish,Project創(chuàng)建完成了。

            Project項(xiàng)目設(shè)置

            鼠標(biāo)選中項(xiàng)目(和IDEA不一樣,此處必須選中),右鍵選擇Properties就可以對(duì)該項(xiàng)目進(jìn)行配置:

            配置項(xiàng)“多如牛毛”,令人望而生畏呀。這里就不一一介紹了,圖形化的東西了解起來(lái)也容易。但是你是否發(fā)現(xiàn),眾多配置項(xiàng)中卻不見(jiàn)Module字樣,怎么肥四?

            Eclipse沒(méi)有Module概念

            如果想在hello項(xiàng)目下創(chuàng)建一個(gè)hello-client項(xiàng)目怎么辦?答曰:在邏輯層面eclipse做不到,只能在路徑結(jié)構(gòu)下體現(xiàn),具體創(chuàng)建動(dòng)作為:點(diǎn)擊新建項(xiàng)目,然后自定義這個(gè)路徑,把它放在hello下面。

            點(diǎn)擊Finish后,項(xiàng)目結(jié)構(gòu)上看如下圖所示:

            上圖是Project Explorer,但若你切換到Package Explorer的話截圖如下:

            從這里能看出,eclipse在邏輯上是不存在層級(jí)概念的,沒(méi)有module只有Project。

            即便你導(dǎo)入的是maven項(xiàng)目(maven有模塊概念)也是這樣子,這里以dubbo為例:

            Package Explorer視圖

            所以請(qǐng)記住,這是和IDEA在邏輯結(jié)構(gòu)上非常大的不同:Eclipse里并不存在Module,并不存在Module,并不存在Module。

            解釋.classpath和.project

            eclipse的每個(gè)項(xiàng)目,還有兩個(gè)附加文件:.classpath文件和.project文件。這兩個(gè)文件比較特殊,沒(méi)有文件名,以.開頭,是隱藏文件。

            我們知道IDEA里有兩個(gè)特殊的文件workspace.xml${moduleName}.iml,同樣的eclipse里也有,我們可粗略的稱作它們?yōu)榄h(huán)境描述符和項(xiàng)目描述符。

            .classpath文件

            .classpath文件存儲(chǔ)了項(xiàng)目編譯時(shí)Java構(gòu)建路徑,這個(gè)路徑用$CLASSPATH可引用到。hello項(xiàng)目的此文件內(nèi)容如下:

            簡(jiǎn)而言之,.classpath定義了這個(gè)項(xiàng)目在編譯時(shí)所使用的$CLASSPATH類路徑。

            .project文件

            .project提供了項(xiàng)目的完整描述,包括名稱、描述、項(xiàng)目類型等等。

            對(duì)幾個(gè)標(biāo)簽稍稍解釋下:

            • name:項(xiàng)目名稱,一般和文件夾名稱同名,但它們是兩碼事
            • comment:項(xiàng)目注釋
            • buildCommand:構(gòu)建使用的命令。這里值是org.eclipse.jdt.core.javabuilder,也就是說(shuō)是eclipse幫你編譯的,而非你自己手動(dòng)輸入java命令編譯
            • natures:項(xiàng)目類型,這里org.eclipse.jdt.core.javanature表示一個(gè)java項(xiàng)目

            簡(jiǎn)而言之,.project是項(xiàng)目描述符,有了這個(gè)文件,eclipse加載項(xiàng)目時(shí)就可以按照它顯示啦。

            解釋.settings目錄

            eclipse項(xiàng)目.settings目錄下的配置比較雜,各種后綴名的都可能見(jiàn)到,絕大多數(shù)是文本文件,格式為properties或xml。Properties類型文件多數(shù)以.prefs為后綴名,XML類型文件多數(shù)以.*、.xml為后綴名。

            因?yàn)轭愋捅姸?,這里介紹幾個(gè)較為常見(jiàn)的代表一下:

            • org.eclipse.core.resources.prefs:規(guī)定文件的編碼。盡量不要讓一個(gè)項(xiàng)目中出現(xiàn)多種編碼喲
            • org.eclipse.jdt.core.prefs:指定一些Java編譯的特性,比如編譯版本、警告級(jí)別等等

            結(jié)構(gòu)差異,IDEA跟Eclipse打一架?

            了解了IDEA和Eclipse的項(xiàng)目結(jié)構(gòu)后發(fā)現(xiàn),它倆對(duì)項(xiàng)目的管理方式是完全不一樣的:

            1. 不同的邏輯結(jié)構(gòu)
            2. 不同的元數(shù)據(jù)文件
            3. 元數(shù)據(jù)文件的內(nèi)容、格式都不一樣

            就因?yàn)檫@些差異的存在,就出現(xiàn)了不兼容問(wèn)題:IDEA項(xiàng)目Eclipse不認(rèn)識(shí),反過(guò)來(lái)同理。雖然IDEA做了導(dǎo)入Eclipse項(xiàng)目的功能,但兼容性并不完美,完全是為了“協(xié)助”Eclipse倒戈IDEA的“權(quán)宜之計(jì)”而已~

            也許你會(huì)說(shuō)這影響不大呀,畢竟一個(gè)團(tuán)隊(duì)內(nèi)一般不會(huì)出現(xiàn)既使用IDEA,又使用Eclipse的情況。誠(chéng)然,一般確實(shí)不會(huì)有此類情況發(fā)生,but,視野放大點(diǎn)再想想呢?比如,如果是個(gè)開源項(xiàng)目呢?它面向的是所有開發(fā)者一起協(xié)作,總不能限制人家的IDE吧。還是拿dubbo來(lái)舉例:要把源碼全部提交到github上去的話,應(yīng)該用IDEA的元數(shù)據(jù)文件還是Eclipse的呢?對(duì)于項(xiàng)目本身來(lái)說(shuō),項(xiàng)目名稱、結(jié)構(gòu)、依賴管理等都在元數(shù)據(jù)文件里保存著哩~

            很明顯,用誰(shuí)的都不合適,畢竟現(xiàn)在Java平臺(tái)的IDE還三足鼎立呢(至少還有兩足),“得罪”任何一方都是不行的。況且,對(duì)于程序本身來(lái)說(shuō),IDE并不屬于它的一部分,所以即便IntelliJ IDEA已一統(tǒng)天下了也不應(yīng)該依靠它的元數(shù)據(jù)文件去幫你管理依賴、管理項(xiàng)目。花無(wú)百日紅,明天誰(shuí)知道呢~

            這樣子炒來(lái)炒去不會(huì)有結(jié)論的,那怎么辦,難道非得“動(dòng)手”?

            面對(duì)這種情況,需要做的就是標(biāo)準(zhǔn)化,讓所有的IDE都支持識(shí)別同一種項(xiàng)目/目錄結(jié)構(gòu),問(wèn)題自然迎刃而解了。這個(gè)時(shí)候有“人”就扛起了大旗,承擔(dān)了這種角色的,它就是Maven(發(fā)音為[?mev?n],而不是“馬瘟”)。

            不管是何種IDE,都能識(shí)別和加載maven項(xiàng)目,解析其pom.xml文件生成為IDEA自己的元數(shù)據(jù)文件即可正常完成加載啦。因此,對(duì)于開發(fā)者來(lái)說(shuō),只需要面向Maven管理項(xiàng)目即可,再也無(wú)需關(guān)心具體IDE,這種差異性交由它幫你擺平。繼續(xù)拿dubbo舉例,在實(shí)操中它確實(shí)也是這么干的:只往github里提交了maven結(jié)構(gòu)的源碼和pom.xml元數(shù)據(jù)文件:

            從此即使你用Eclipse,我用IDEA,也能正常的相愛(ài)了。

            值得注意的是:既然使用了maven的項(xiàng)目結(jié)構(gòu),那么提交到github時(shí),一些IDE自己的元數(shù)據(jù)文件就不能再提交了嘍。因此,一般都會(huì)在項(xiàng)目的.gitignore文件里添加上如下配置項(xiàng):

            #?eclipse?ignore
            .settings/
            .project
            .classpath

            #?idea?ignore
            .idea/
            *.ipr
            *.iml
            *.iws

            創(chuàng)建/導(dǎo)入Maven項(xiàng)目

            既然Maven項(xiàng)目已然成為標(biāo)準(zhǔn),因此在實(shí)際情況中不管是新創(chuàng)建,還是接觸到的99.99都是maven項(xiàng)目。IDEA和Eclipse都提供了對(duì)maven項(xiàng)目的“完美”支持。

            IDEA和Maven項(xiàng)目

            創(chuàng)建Maven項(xiàng)目:

            左邊類別中選擇Maven就表示需要?jiǎng)?chuàng)建一個(gè)maven項(xiàng)目,點(diǎn)擊Next(當(dāng)然你也可以選擇一個(gè)模版骨架,如果公司有統(tǒng)一骨架的話):

            點(diǎn)擊Finish,打開一個(gè)新的IDEA窗口,大功告成:

            繼續(xù)創(chuàng)建兩個(gè)子模塊(hello-client和hello-service),同樣也用Maven項(xiàng)目:

            點(diǎn)擊Finish,并在子模塊里添加Spring Context依賴:

            并讓hello-service模塊依賴hello-client模塊:

            所以現(xiàn)在即使在hello-service模塊里也能正常使用spring-conext相關(guān)類嘍:

            什么原因?查看項(xiàng)目的結(jié)構(gòu)Project Structure一探究竟:

            hello-client模塊里的依賴:spring-context

            hello-service模塊里的依賴:

            這里有spring-context的依賴,所以就能夠正常使用。

            發(fā)現(xiàn)沒(méi)有,在創(chuàng)建此項(xiàng)目時(shí),開發(fā)者只需要關(guān)心Maven方式創(chuàng)建,模塊依賴的時(shí)候也只需更改Maven的元數(shù)據(jù)文件pom.xml即可,IDEA我會(huì)自動(dòng)“解析”好放在項(xiàng)目結(jié)構(gòu)Project Structure里并保存在它自己的元數(shù)據(jù)文件中(如xxx.iml文件等),從而確保了正常運(yùn)行和管理。

            打開/導(dǎo)入Maven項(xiàng)目:

            打開窗口,選中pom文件(或者頂層文件夾)即可搞定。

            導(dǎo)入maven模塊時(shí)稍微有點(diǎn)不一樣,了解一下:

            ?

            注意:在IDEA里Project項(xiàng)目是不存在import導(dǎo)入這么一說(shuō)的,因?yàn)樗莻€(gè)獨(dú)立體,只能說(shuō)是打開項(xiàng)目

            ?

            選中某個(gè)文件夾后,確定進(jìn)入下一步:

            如圖,IDEA支持把多種類型的模塊導(dǎo)入進(jìn)來(lái),不可謂不強(qiáng)大:

            • Android Gradle:若是安卓項(xiàng)目,選此項(xiàng)
            • Eclipse:若是Eclipse項(xiàng)目,選此項(xiàng)(請(qǐng)注意:有eclipse元數(shù)據(jù)文件的才叫eclipse項(xiàng)目,而并不是對(duì)方用Eclipse開發(fā)就一定是eclipse項(xiàng)目,畢竟還有可能是maven項(xiàng)目嘛)
            • Gradle項(xiàng)目:若是Gradle項(xiàng)目,選此項(xiàng)。比如Spring Framework項(xiàng)目
            • maven項(xiàng)目:99%情況下,我們選擇的應(yīng)該都是此項(xiàng)

            點(diǎn)擊Finish即可把該模塊導(dǎo)入進(jìn)來(lái)了。

            值得一提:很多“老程序員”在一個(gè)IDEA窗口里看似顯示了多個(gè)“項(xiàng)目”,其實(shí)就是把一個(gè)Project當(dāng)作一個(gè)Module模塊導(dǎo)入進(jìn)來(lái)了,這樣做是非常不建議的,不信打開你的Project Structure瞅一眼,簡(jiǎn)直亂如麻,就是災(zāi)難無(wú)法管理。本系列前面文章詳細(xì)介紹了這么做不妥的原因,并給了最佳實(shí)踐。

            Eclipse和Maven項(xiàng)目

            大同小異,略。

            Maven一統(tǒng)天下

            ?

            說(shuō)明:本文并非Maven專題,僅對(duì)其一統(tǒng)天下的現(xiàn)狀簡(jiǎn)單聊幾句

            ?

            Maven是一個(gè)項(xiàng)目管理工具:包含了一個(gè)項(xiàng)目對(duì)象模型 (POM:Project Object Model),一組標(biāo)準(zhǔn)項(xiàng)目結(jié)構(gòu),一個(gè)項(xiàng)目生命周期(Project Lifecycle),一個(gè)依賴管理系統(tǒng)(Dependency Management System),和用來(lái)運(yùn)行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯。

            Maven的每個(gè)功能都是殺手級(jí)別的存在,非常強(qiáng)大和好用,中大型項(xiàng)目必備。譬如其依賴管理系統(tǒng),若沒(méi)有它的話依賴一個(gè)Jar得先去官網(wǎng)down一個(gè)對(duì)應(yīng)版本的下來(lái),然后添加到IDE里,打包的時(shí)候一起打進(jìn)去,可謂麻煩至極且容易出錯(cuò)。

            也不知道Maven什么時(shí)候早已一統(tǒng)天下了,反正A哥知道早在2015年Spring Framework團(tuán)隊(duì)就宣布其官網(wǎng) 再也不提供 Jar包的下載;在github上幾乎所有的流行的Java項(xiàng)目都用通過(guò)Maven來(lái)構(gòu)建和管理的;對(duì)于年輕一點(diǎn)的程序員來(lái)說(shuō),如果一個(gè)項(xiàng)目不是Maven項(xiàng)目,大概率不知如何上手,因?yàn)樯蠈W(xué)的時(shí)候默認(rèn)就是按照maven項(xiàng)目來(lái)講的。

            如今2021年了,Maven項(xiàng)目是絕對(duì)的王者,事實(shí)的標(biāo)準(zhǔn)。不客氣的說(shuō)“幾乎所有”中大型Java項(xiàng)目都是Maven項(xiàng)目(Spring Boot默認(rèn)就是Maven項(xiàng)目),這或許是它的最大貢獻(xiàn)之一,讓全世界的Java開發(fā)者們統(tǒng)一了“語(yǔ)言”。Maven的存在也極大的鞏固了Java生態(tài),降低管理、構(gòu)建、依賴管理的門檻,使得一直能以保持活力。

            說(shuō)到Maven就不得不提一提Gradle??赡苡型瑢W(xué)會(huì)說(shuō)Gradle會(huì)替代Maven成為下一代最流行的項(xiàng)目管理構(gòu)建工具,不信你看Spring Framework都遷過(guò)去用Gradle構(gòu)建了。誠(chéng)然Gradle作為新一代產(chǎn)品有很多“過(guò)人之處”,但在可預(yù)見(jiàn)的將來(lái),Java平臺(tái)里Maven依舊是絕對(duì)的標(biāo)準(zhǔn),無(wú)可撼動(dòng)。畢竟Maven功能非常完善,關(guān)鍵是沒(méi)有致命的缺點(diǎn),換的動(dòng)力并不大的。而且存量市場(chǎng)過(guò)于龐大,船大難掉頭甚至不會(huì)掉頭。就像當(dāng)年的xhtml一直雄心勃勃想干掉html一樣,最后,你懂的~

            ?

            Gradle在Android開發(fā)中是主流,因此對(duì)于這種“新新技術(shù)”采用Gradle是不錯(cuò)的選擇

            ?

            總結(jié)

            本文介紹了IDEA項(xiàng)目和Eclipse項(xiàng)目的差異,目的是徹底的弄明白二者在項(xiàng)目管理上的區(qū)別,不要再人云亦云。

            從小了說(shuō),本文能幫你解釋為毛項(xiàng)目中的xxx.iml,.project等文件都絕對(duì)不要提交到github倉(cāng)庫(kù),否則會(huì)被罰工資;從大了說(shuō)本文告訴了你是Maven幫你做到了屏蔽差異讓項(xiàng)目標(biāo)準(zhǔn)化的,這是不用再關(guān)心具體IDEA的底層原因。

            ?

            說(shuō)明:在Maven之前是Ant來(lái)管理和構(gòu)建項(xiàng)目,做到統(tǒng)一化。但因Ant有點(diǎn)久遠(yuǎn)了,所以本文直接以大家更為熟悉的Maven做解答

            ?

            當(dāng)然嘍,本文并非Maven專題,所以對(duì)它的描述也只是一筆帶過(guò)。Maven的作用遠(yuǎn)遠(yuǎn)不止如此哈。

            往期熱門文章:

            1、歷史文章分類導(dǎo)讀列表!精選優(yōu)秀博文都在這里了!》

            2、萬(wàn)億級(jí)數(shù)據(jù)應(yīng)該怎么遷移?
            3、從應(yīng)用到底層 36張圖帶你進(jìn)入Redis世界
            4、寫代碼有這16個(gè)好習(xí)慣,可以減少80%非業(yè)務(wù)的bug
            5、順豐快遞:請(qǐng)簽收MySQL靈魂十連

            6、一個(gè)基于SpringBoot + MyBatis + Vue的代碼生成器
            7、Redis 分布式鎖使用不當(dāng),超賣了100瓶飛天茅臺(tái)?。?!

            8、如何設(shè)計(jì)訂單系統(tǒng)?這篇寫得太好了!
            9如果MySQL磁盤滿了,會(huì)發(fā)生什么?還真被我遇到了!
            10、阿里開源的27個(gè)項(xiàng)目,值得收藏!
            瀏覽 35
            點(diǎn)贊
            評(píng)論
            收藏
            分享

            手機(jī)掃一掃分享

            分享
            舉報(bào)
            評(píng)論
            圖片
            表情
            推薦
            點(diǎn)贊
            評(píng)論
            收藏
            分享

            手機(jī)掃一掃分享

            分享
            舉報(bào)
            <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>
                    日韩性爱一区二区三区 | 欧美日逼网 | 狠狠撸视频在线观看 | 亚洲成在线 | 大地电影资源第五页在线观看 |