京山游俠

          專(zhuān)注技術(shù),拒絕扯淡
          posts - 50, comments - 868, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          日歷

          <2013年12月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          搜索

          •  

          積分與排名

          • 積分 - 658181
          • 排名 - 73

          最新評(píng)論

          參考資料:
            1.Maven官方文檔http://maven.apache.org/guides/index.html
            2.Git官方文檔http://git-scm.com/documentation
            3.SpringSide4官方文檔https://github.com/springside/springside4/wiki

            本博文不同于網(wǎng)上隨處可見(jiàn)的《Maven使用教程》《Git使用教程》等之類(lèi)的文章。我并不會(huì)從軟件的安裝和基本的命令開(kāi)始講起,而是通過(guò)探討他們包含了哪些設(shè)計(jì)哲學(xué)和能為我們帶來(lái)什么樣的項(xiàng)目管理體驗(yàn),讓大家能在最短的時(shí)間內(nèi)通過(guò)一篇博客上手Maven和Git。
            Maven是一個(gè)優(yōu)秀的Java項(xiàng)目管理工具。在用Java做項(xiàng)目時(shí),項(xiàng)目的創(chuàng)建、編譯、測(cè)試、打包和安裝部署都需要敲入不少的命令,而且在編譯和運(yùn)行Java程序時(shí),必須能從CLASSPATH中找到該項(xiàng)目依賴(lài)的jar包,否則編譯無(wú)法順利進(jìn)行,更不可能成功運(yùn)行。為解決這些問(wèn)題,Maven應(yīng)運(yùn)而生。

          Maven的特點(diǎn):
            1.可以根據(jù)模板創(chuàng)建項(xiàng)目,也可以從已有的項(xiàng)目生成模板,這里的模板,Maven術(shù)語(yǔ)叫archetype;
            2.自動(dòng)管理依賴(lài)的jar;
            3.配置文件非常簡(jiǎn)短;
            4.可以有非常豐富的插件,對(duì)大部分人來(lái)說(shuō),使用插件非常簡(jiǎn)單,不需要了解插件怎么編寫(xiě),而且插件的下載和管理都是自動(dòng)的。

          Maven關(guān)鍵詞:convention; phase; archetype; groupId; artifactId; plugin; task; dependency; repository

          以下是我對(duì)Maven的理解。
            Maven管理一個(gè)項(xiàng)目時(shí),會(huì)在項(xiàng)目的目錄下放一個(gè)pom.xml配置文件,該配置文件非常簡(jiǎn)短。之所以能夠做到讓配置文件非常簡(jiǎn)短,是因?yàn)镸aven管理項(xiàng)目的時(shí)候遵循的是一種慣例(convention),Maven項(xiàng)目的目錄結(jié)構(gòu)基本是固定的,而且對(duì)項(xiàng)目管理中的各個(gè)階段(phase)的定義也是固定的,所以即使不在pom.xml配置文件中做任何特殊定義,也可以使用Maven的標(biāo)準(zhǔn)命令mvn compile、mvn test、mvn package、mvn install自動(dòng)進(jìn)行項(xiàng)目的編譯、測(cè)試、打包、安裝。
            對(duì)于復(fù)雜的任務(wù)則是通過(guò)插件(plugin)來(lái)完成,定義在插件中的操作稱(chēng)為任務(wù)(task),使用的格式為mvn plugin:task。使用Maven創(chuàng)建一個(gè)新項(xiàng)目就是通過(guò)archetype插件的generate任務(wù)做到的,命令格式為mvn archetype:generate。同樣,可以為Maven管理的項(xiàng)目生成Eclipse的項(xiàng)目文件,命令為mvn eclipse:eclipse。插件和依賴(lài)項(xiàng)一樣,也是自動(dòng)下載和管理的,不需要用戶(hù)干預(yù)。
            自動(dòng)下載的依賴(lài)項(xiàng)和插件都存放在本地倉(cāng)庫(kù)(repository)中,該倉(cāng)庫(kù)一般位于用戶(hù)目錄的.m2目錄下。我們自己的項(xiàng)目執(zhí)行mvn install時(shí),也默認(rèn)安裝到該倉(cāng)庫(kù)中。每一個(gè)項(xiàng)目都需要用groupId、artifactId和version來(lái)標(biāo)識(shí),包括我們自己的項(xiàng)目、依賴(lài)項(xiàng)、插件、創(chuàng)建新項(xiàng)目要用到的模板等都是如此。使用mvn archetype:generate創(chuàng)建新項(xiàng)目時(shí)需要指定archetypeGroupId和archetypeArtifactId。groupId代表該項(xiàng)目所在的小組,比如org.apache.maven,這是Java世界的命名哲學(xué),在這里不詳細(xì)敘述,artifactId則只需要簡(jiǎn)單指定一個(gè)項(xiàng)目的名字即可,打包成jar文件的時(shí)候,會(huì)生成名字為artifactId-version.jar的文件。
            下面看具體示例。如果要?jiǎng)?chuàng)建一個(gè)空項(xiàng)目,使用如下命令:
          mvn archetype:generate \
          -DarchetypeGroupId
          =org.apache.maven.archetypes \
          -DarchetypeArtifactId
          =maven-archetype-quickstart \
          -DgroupId
          =com.xkland.maven-example \
          -DartifactId
          =maven-example
            如果要生成一個(gè)空白的Web項(xiàng)目,使用如下命令:
          mvn archetype:generate \
          -DarchetypeGroupId
          =org.apache.maven.archetypes \
          -DarchetypeArtifactId
          =maven-archetype-webapp \
          -DgroupId
          =com.xkland.maven-web-example \
          -DartifactId
          =maven-web-example
          從上面命令可以看出,要?jiǎng)?chuàng)建不同類(lèi)型的項(xiàng)目,只需要指定不同的archetype即可。下面我們看看用以上命令生成的項(xiàng)目的文件結(jié)構(gòu)。

            再以SpringSide4為例。先從Github上將SpringSide4克隆下來(lái)。(稍后會(huì)講到Git)命令如下:
          git clone https://github.com/springside/springside4.git
            進(jìn)入springside4目錄,可以看到里面有三個(gè)主要的目錄,分別為examples、modules、supports。進(jìn)入到modules目錄,運(yùn)行mvn install就可以將SpringSide4安裝到本地倉(cāng)庫(kù)了,就這么簡(jiǎn)單。不過(guò),這個(gè)操作要花的時(shí)間比較長(zhǎng),因?yàn)樾枰螺d很多依賴(lài)的庫(kù)。
            安裝好SpringSide4后,要?jiǎng)?chuàng)建基于SpringSide的項(xiàng)目,先進(jìn)入support/maven-archetype目錄,運(yùn)行mvn install安裝SpringSide的archetype,然后只需要如下命令即可:
          mvn archetype:generate \
          -DarchetypeGroupId
          =org.springside.examples \
          -DarchetypeArtifactId
          =quickstart-archetype \
          -DarchetypeVersion
          =4.1.1-SNAPSHOT \
          -DgroupId
          =com.xkland.springside-sample \
          -DartifactId
          =springside-example
            該命令涉及到的知識(shí)不超過(guò)我之前的論述。我這里沒(méi)有講到pom.xml文件的配置語(yǔ)法,大家可以參考官方文檔,后面,我們會(huì)進(jìn)入IDE時(shí)代。

            軟件開(kāi)發(fā)過(guò)程中,還有另外一個(gè)問(wèn)題需要解決,那就是源代碼的版本控制和多人協(xié)作。現(xiàn)在最流行的是版本控制軟件是Git,越來(lái)越多的開(kāi)源軟件從Subversion遷移到了Git。
          Git的特點(diǎn):
            1.Git是分布式的版本控制系統(tǒng),它沒(méi)有中心服務(wù)器的概念(雖然實(shí)際開(kāi)發(fā)中可以建一個(gè)中心服務(wù)器),每一臺(tái)開(kāi)發(fā)機(jī)器上都保存完整的歷史記錄;但是它有本地代碼倉(cāng)庫(kù)和遠(yuǎn)程代碼倉(cāng)庫(kù)的概念(不然怎么多人協(xié)作?),而且可以追蹤多個(gè)遠(yuǎn)程倉(cāng)庫(kù);
            2.Git能夠非常快地建立分支和合并分支,并具有強(qiáng)大的跟蹤分支和切換分支的能力。
            以上兩個(gè)特點(diǎn)決定了使用Git工作的流程。關(guān)于Git的使用和工作流程,我將在后面詳細(xì)敘述。先來(lái)看看要理解Git需要理解哪些關(guān)鍵詞。
          Git的關(guān)鍵詞:working directory; repository; stage; commit; remote; branch; merge
          下面是我的理解。
            每一個(gè)項(xiàng)目都應(yīng)該有一個(gè)工作目錄(Working directory),我們可以自己建一個(gè)目錄(這不是廢話嗎?別急,下面還有。),然后把這個(gè)目錄里面的代碼用Git管理起來(lái)(使用git init命令和git add命令,后面詳述),也可以通過(guò)git clone命令從別的地方克隆一個(gè)項(xiàng)目過(guò)來(lái)自動(dòng)生成一個(gè)工作目錄。在工作目錄中的文件就是當(dāng)前編輯和修改的文件,如果是新建立的目錄或新clone來(lái)的目錄,工作目錄中的文件就是該項(xiàng)目最新的狀態(tài)。Git是在本地保存有所有的歷史記錄和分支記錄的,這些內(nèi)容都在工作目錄的.git目錄中,稱(chēng)之為本地倉(cāng)庫(kù)(local repository)。當(dāng)切換分支或查看以前的歷史版本時(shí),工作目錄中的文件自動(dòng)改變(這才是重點(diǎn),工作無(wú)需切換目錄,目錄中的文件會(huì)自動(dòng)切換)。工作目錄中的文件有三種狀態(tài):已修改、已暫存(stage)、已提交。修改后的文件可以先加入暫存區(qū)域,一次工作結(jié)束后一起提交。
            Git是分布式的,沒(méi)有中心服務(wù)器的概念,但實(shí)際工作中仍然可以把代碼倉(cāng)庫(kù)放到一臺(tái)大家都可以訪問(wèn)的服務(wù)器上,做實(shí)際的中心服務(wù)器使用(僅在小團(tuán)隊(duì)時(shí)使用此工作流程,原因后面詳述)。在本地機(jī)器上工作完后,使用git push命令把倉(cāng)庫(kù)推送到服務(wù)器上,換一個(gè)地方換一臺(tái)機(jī)器后,只需要git clone一下,又可以獲得所有的代碼(包含所有的歷史記錄及分支)繼續(xù)工作。服務(wù)器故障也沒(méi)問(wèn)題,因?yàn)槊恳粋€(gè)工作的機(jī)器上都保存有完整的代碼倉(cāng)庫(kù),所以從不用擔(dān)心代碼丟失。沒(méi)有網(wǎng)絡(luò)也沒(méi)有關(guān)系,在本地機(jī)器上照樣可以提交(git commit),因?yàn)檎麄€(gè)倉(cāng)庫(kù)就在自己的機(jī)器上,當(dāng)有網(wǎng)絡(luò)時(shí),push一下就可以了。
            Git有遠(yuǎn)程倉(cāng)庫(kù)(remote repository)的概念,而且可以管理很多個(gè)遠(yuǎn)程倉(cāng)庫(kù),遠(yuǎn)程倉(cāng)庫(kù)可以是服務(wù)器,也可以是別人的個(gè)人計(jì)算機(jī)(但一般沒(méi)有人這么用),每一個(gè)遠(yuǎn)程倉(cāng)庫(kù)都有一個(gè)簡(jiǎn)短的名字和一個(gè)地址,最開(kāi)始clone代碼的那個(gè)遠(yuǎn)程倉(cāng)庫(kù)別名往往默認(rèn)為origin,自己添加的遠(yuǎn)程倉(cāng)庫(kù)可以隨意指定別名,當(dāng)然所有的遠(yuǎn)程倉(cāng)庫(kù)都可以隨意修改別名。可以從遠(yuǎn)程倉(cāng)庫(kù)獲取代碼(git fetch命令或git pull命令),也可以把自己的代碼推送到遠(yuǎn)程倉(cāng)庫(kù)(git push命令,需要寫(xiě)權(quán)限)。
            既然Git即可以隨便從遠(yuǎn)程倉(cāng)庫(kù)獲取代碼,又可以把自己的代碼推送到遠(yuǎn)程倉(cāng)庫(kù),那么當(dāng)多人協(xié)作時(shí),豈不會(huì)亂套嗎?解決這個(gè)問(wèn)題的,就是Git的必殺之技——創(chuàng)建分支及分支合并。下面要用圖表來(lái)說(shuō)明問(wèn)題了。下面一系列圖片來(lái)自Git官方網(wǎng)站上的電子書(shū)《Pro Git》。
            首先,隨著一次次的提交,在本地代碼庫(kù)中形成一個(gè)主分支,如下圖:

          有時(shí)為了開(kāi)發(fā)新特性,隨時(shí)可以開(kāi)一個(gè)新分支,如下圖:



          新分支和主分支之間可以隨意切換,隨著分支的發(fā)展,形式如下圖:



          主分支也可以向前發(fā)展,如下:



          最終,當(dāng)新分支代碼很穩(wěn)定以后,可以將其合并到主分支,如下圖:



          而能夠防止多人協(xié)作時(shí)出現(xiàn)混亂的關(guān)鍵就在于,當(dāng)從遠(yuǎn)程倉(cāng)庫(kù)clone代碼庫(kù)到本地或fetch代碼庫(kù)到本地時(shí),遠(yuǎn)程分支的標(biāo)記并不等于本地分支的標(biāo)記。從遠(yuǎn)程clone一個(gè)代碼庫(kù)到本地后,其master分支有兩個(gè)標(biāo)記,一個(gè)標(biāo)記為origin/master表示遠(yuǎn)程庫(kù)中的master分支,一個(gè)標(biāo)記為master,表示本地的master分支。如下圖:


          可以想象,由于別人的工作,遠(yuǎn)程倉(cāng)庫(kù)中的master分支肯定會(huì)向前繼續(xù)移動(dòng),但是在下次聯(lián)網(wǎng)之前,該origin/master標(biāo)記不會(huì)移動(dòng)。而本地的master標(biāo)記繼續(xù)向前移動(dòng)。

          直到下次聯(lián)網(wǎng),使用git fetch命令將遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容取回本地,origin/master標(biāo)記才會(huì)改變位置,這時(shí),看起來(lái)就像是兩個(gè)分支,如下圖:

          最后,將origin/master分支合并到master分支中(使用get merge命令),本地代碼庫(kù)又一次變成了一個(gè)單一的master分支,繼續(xù)向前開(kāi)發(fā),并可以將它push到遠(yuǎn)程倉(cāng)庫(kù),供別人使用。
            Git沖突的處理完全靠人工完成。(從邏輯上講,機(jī)器也不可能完美處理沖突。)比如一個(gè)小型團(tuán)隊(duì)一起工作,他們可以設(shè)置一個(gè)服務(wù)器用于保存遠(yuǎn)程Git倉(cāng)庫(kù),然后每個(gè)人工作之前先從該遠(yuǎn)程倉(cāng)庫(kù)fetch代碼,接著工作,工作完成后,先在本地提交,最后push到遠(yuǎn)程倉(cāng)庫(kù)。但是當(dāng)一個(gè)人push的時(shí)候,已經(jīng)有人在他之前push了,如果他們工作在同一個(gè)分支,就會(huì)出現(xiàn)沖突。解決沖突的辦法就是先把別人push的內(nèi)容再次fetch下來(lái),合并分支,然后再push。
            通過(guò)之前對(duì)git原理的了解,可以分析得出使用Git時(shí)有以下幾種工作流程:
            1.一個(gè)人單干,不需要考慮沖突,隨時(shí)可以開(kāi)分支、合并分支和切換分支,隨時(shí)可以本地提交。如果為了防止代碼丟失,可以開(kāi)一個(gè)服務(wù)器,每次工作完成就push到服務(wù)器上;
            2.小型團(tuán)隊(duì)合作,如前所述,開(kāi)一個(gè)服務(wù)器保存代碼倉(cāng)庫(kù),然后所有的人把該服務(wù)器當(dāng)成遠(yuǎn)程倉(cāng)庫(kù),工作之前先f(wàn)etch,工作之后再push。如果有沖突,則先f(wàn)etch,合并分支解決沖突后再push。如果團(tuán)隊(duì)人數(shù)太多,每個(gè)人都向該服務(wù)器push,那沖突該是有多少?有可能一個(gè)開(kāi)發(fā)者第一次向服務(wù)器push的時(shí)候,有人在他之前已經(jīng)push過(guò)了,他只好先f(wàn)etch,手工合并解決沖突,可等他再次push的時(shí)候,發(fā)現(xiàn)又有人再他之前已經(jīng)push了,于是他只好再做一次解決沖突的流程,可是如果在他工作的時(shí)候,又有人push了呢?這也是之前講的該工作流程只適合小型開(kāi)發(fā)團(tuán)隊(duì)的原因。
            以上流程經(jīng)過(guò)適當(dāng)修改也可以供大型團(tuán)隊(duì)使用,那就是將團(tuán)隊(duì)分組,每個(gè)組的成員共用一個(gè)服務(wù)器當(dāng)遠(yuǎn)程倉(cāng)庫(kù),組長(zhǎng)合并了該組的工作成果后,再push到另一個(gè)服務(wù)器當(dāng)總的遠(yuǎn)程倉(cāng)庫(kù),這樣就可以大大減少?zèng)_突的數(shù)量,減少工作量。
            3.開(kāi)源項(xiàng)目的合作,在這種情況下,每個(gè)人都把自己的倉(cāng)庫(kù)暴露在互聯(lián)網(wǎng)上。開(kāi)源項(xiàng)目的組織者或負(fù)責(zé)人將所有人的倉(cāng)庫(kù)設(shè)為遠(yuǎn)程倉(cāng)庫(kù),并把有意義的工作合并到主分支,然后發(fā)布官方的Git倉(cāng)庫(kù)。每個(gè)開(kāi)發(fā)者從官方倉(cāng)庫(kù)fetch代碼后,完成自己的工作,然后再把它push到互聯(lián)網(wǎng)上自己的倉(cāng)庫(kù),等著項(xiàng)目負(fù)責(zé)人將自己的工作整合到官方倉(cāng)庫(kù)中。如果項(xiàng)目負(fù)責(zé)人不干了,改人了,只要還有人繼續(xù)開(kāi)發(fā),該項(xiàng)目就可以繼續(xù)下去。碰到團(tuán)隊(duì)比較大的情況,也可以進(jìn)行分組。
            服務(wù)器的建設(shè)也相當(dāng)簡(jiǎn)單,因?yàn)镚it支持以SSH、HTTP等協(xié)議傳輸數(shù)據(jù),如果需要對(duì)服務(wù)器有寫(xiě)權(quán)限,就開(kāi)通SSH服務(wù)吧,設(shè)一個(gè)賬戶(hù)供所有人訪問(wèn)Git倉(cāng)庫(kù)即可。如果只需要只讀權(quán)限,使用任何一個(gè)HTTP服務(wù)器均可。關(guān)于Git服務(wù)器的建設(shè),請(qǐng)自行參考官方文檔。如果是個(gè)人的、開(kāi)源的項(xiàng)目,可以使用Github網(wǎng)站提供的服務(wù),直接存儲(chǔ)在互聯(lián)網(wǎng)上。(Github私人倉(cāng)庫(kù)是要收錢(qián)的。)

          看來(lái)要把Git講清楚并不容易,用了這么多篇幅。下面把Git常用的命令回顧一下:
            git config 配置Git,一般使用不需要特別配置,但至少要設(shè)置開(kāi)發(fā)者的名字和郵箱
            git init和git add 創(chuàng)建一個(gè)新倉(cāng)庫(kù),并跟蹤工作目錄下的文件
            git clone 從遠(yuǎn)程克隆一個(gè)項(xiàng)目,包括工作目錄和倉(cāng)庫(kù)
            git add 將修改后的文件放入緩存區(qū)域(staging area),或這表示沖突已經(jīng)解決
            git status 顯示文件狀態(tài),是已修改還是已緩存還是已提交
            git commit 提交項(xiàng)目
            git remote 管理遠(yuǎn)程倉(cāng)庫(kù)
            git fetch和git pull 從遠(yuǎn)程倉(cāng)庫(kù)抓取數(shù)據(jù)
            git push 向遠(yuǎn)程倉(cāng)庫(kù)推送數(shù)據(jù)
            git branch和git merge 創(chuàng)建分支及合并分支
            git checkout 切換分支

          git還有一個(gè)可視化工具gitk,使用它,可以以圖形化的方式查看提交的歷史、分支及合并分支等信息。下圖是我在springside4目錄下執(zhí)行g(shù)itk的截圖:

          可以看到這里有一段復(fù)雜的開(kāi)分支、合分支的記錄。

          這篇博文里沒(méi)有寫(xiě)Maven、Git、Eclipse的安裝,因?yàn)樵谖业南到y(tǒng)中只需要一個(gè)sudo apt-get install maven git eclipse就統(tǒng)統(tǒng)搞定,OpenJDK神馬的,作為依賴(lài)項(xiàng)當(dāng)然是自動(dòng)安裝了。對(duì),你沒(méi)猜錯(cuò),我用的是Ubuntu。操作系統(tǒng)版本Ubuntu 13.10,maven 3.0.4、git 1.8.3.2、eclipse 3.8。同時(shí)給eclipse安裝上m2e及EGit插件。
          如果只是泛泛地寫(xiě)Maven和Git的用法,那就不是我的風(fēng)格了,下面當(dāng)然是show圖片了。沒(méi)有寬屏顯示器的朋友們對(duì)不起了。不過(guò)可以通過(guò)Ctrl+鼠標(biāo)滾輪將網(wǎng)頁(yè)縮小后查看。
          下圖,我的Ubuntu桌面:

          下圖,在虛擬控制臺(tái)(gnome-terminal)中使用簡(jiǎn)潔而功能強(qiáng)大的上古神器Vim編輯器,配合半透明背景,酷斃了:

          下圖,我的工作界面,同時(shí)使用控制臺(tái)和Eclipse,方便高效:


          當(dāng)在Eclipse中選擇新建項(xiàng)目的時(shí)候,可以選擇建立Maven項(xiàng)目或Maven模塊,如下圖:

          點(diǎn)下一步,可以看到讓選擇archetype,如下圖:


          再點(diǎn)下一步,發(fā)現(xiàn)要填寫(xiě)的內(nèi)容也不超過(guò)之前提到的知識(shí)范圍:


          點(diǎn)Finish,就可以完成一個(gè)Maven項(xiàng)目的創(chuàng)建。

          當(dāng)然,也可以導(dǎo)入已有的Maven項(xiàng)目,如下圖:


          看看pom.xml配置文件的可視化編輯器,這也是我之前不講pom.xml配置語(yǔ)法的原因,如下圖:


          要運(yùn)行Maven項(xiàng)目,請(qǐng)看Run As菜單:


          獲得一個(gè)用Git管理的項(xiàng)目也是有兩種途徑,一種為使用Eclipse的File->Import菜單,導(dǎo)入一個(gè)已經(jīng)包含Git倉(cāng)庫(kù)的項(xiàng)目;另一種方法就是為一個(gè)已存在的項(xiàng)目創(chuàng)建一個(gè)Git倉(cāng)庫(kù)。
          用Import導(dǎo)入項(xiàng)目時(shí),也可以從Github克隆。不過(guò)我的Egit插件似乎有點(diǎn)問(wèn)題,使用插件自帶的搜索功能不能從Github上找到項(xiàng)目,但是直接指定URL可以。
          還是以SpringSide為例。選擇File->Import,彈出如下對(duì)話框,如下圖:

          但是在這里只能選擇Projects from Git,選擇下面的Repositories from GitHub是搜不到項(xiàng)目的。

          下一步,如下圖:


          選擇URI,繼續(xù)下一步,如下圖:


          輸入SpringSide4項(xiàng)目庫(kù)的地址。看清楚,是https協(xié)議哦。繼續(xù)下一步,如下圖:


          只有主分支可選,如果不是這樣,就選擇所有分支。然后下一步,如下圖:

          在這里需要強(qiáng)調(diào)一下,一定要選擇第三個(gè):Import as general project。原因就是因?yàn)镾pringSide的工作目錄內(nèi)沒(méi)有Eclipse項(xiàng)目所需要的.project文件。如果是用Eclipse創(chuàng)建的項(xiàng)目,本身含有.project文件,就可以使用第一項(xiàng):Import existing projects。好了,點(diǎn)Finish,springside項(xiàng)目成功導(dǎo)入。所有有關(guān)Git的操作都可以在快捷菜單的Team菜單項(xiàng)中找到,如下圖:


          如果選擇Show in history,就可以看到這樣的歷史記錄:


          從Github導(dǎo)入項(xiàng)目就展示到這里,其它的功能在IDE環(huán)境下大家自己慢慢摸索,應(yīng)該是很簡(jiǎn)單的。下面看看為一個(gè)已經(jīng)存在的項(xiàng)目創(chuàng)建Git倉(cāng)庫(kù)。

          如下圖,在maven-example項(xiàng)目的快捷菜單中選擇Team->Share project:


          彈出如下對(duì)話框:


          當(dāng)然是選擇Git而不是CVS了。下一步,如下圖:
           
          到這里就要注意了,這個(gè)對(duì)話框中有一個(gè)Use or creat repository in parent folder of project的單選框,如果把鼠標(biāo)放在上面,還有提示。提示說(shuō)勾選這個(gè)單選框是不推薦的,因?yàn)闀?huì)在Eclipse的工作目錄中創(chuàng)建Git倉(cāng)庫(kù)。而在Eclipse工作目錄中創(chuàng)建Git倉(cāng)庫(kù)可能會(huì)出某些問(wèn)題。具體是什么問(wèn)題,EGit User Guide里面有說(shuō)明。

          為了方便起見(jiàn),還是勾選這個(gè)單選框。勾選后,對(duì)話框變成下面這樣:


          點(diǎn)Create Repository后,點(diǎn)Finish就可以完成Git倉(cāng)庫(kù)的創(chuàng)建了。

          創(chuàng)建Git倉(cāng)庫(kù)后,項(xiàng)目中的文件還沒(méi)有被Git跟蹤,所以顯示的是問(wèn)號(hào)標(biāo)記,如下圖:


          點(diǎn)快捷菜單Team->Add to index后,文件加入追蹤,顯示的是+號(hào)標(biāo)記,如下圖:


          提交工作的對(duì)話框,如下圖:


          提交后,項(xiàng)目中的文件標(biāo)記如下圖:


            好了,就寫(xiě)這么多吧。截圖也是一個(gè)很累人的工作。展示這么多圖片可不是為了取代官方教程,只是為了展示一下效果。讓大家知道這個(gè)IDE還是很好很強(qiáng)大的,最重要的是,工作界面是很漂亮的。

          重點(diǎn)補(bǔ)充:

            Git和Eclipse的EGit插件對(duì)于關(guān)鍵詞Repository的理解不一致,需要重點(diǎn)強(qiáng)調(diào)。在Git中,Repository的定義就是工作目錄下的.git目錄,工作目錄就是是一個(gè)Project的根目錄。Repository是工作目錄的子目錄。

            為了證明不是我對(duì)Repository理解錯(cuò)誤,下面是《Pro Git》中的部分原文:

          Getting a Git Repository
           You can get a Git project using two main approaches. The first takes an existing project or directory and imports it into Git. The second clones an existing Git repository from another server.

          Initializing a Repository in an Existing Directory
           If you’re starting to track an existing project in Git
          , you need to go to the project’s directory and type
           $ git init
           This creates a new subdirectory named .git that contains all of your necessary repository files — a Git repository skeleton. 


            而Eclipse的EGit插件則不一樣。在Eclipse的世界里,Project是一個(gè)比較小的概念,而且不能嵌套,否則IDE會(huì)出問(wèn)題,再加上Eclipse世界的觀點(diǎn)認(rèn)為我們經(jīng)常需要在一個(gè)workspace中開(kāi)多個(gè)Project。所以Git中的working directory不是一個(gè)Project的工作目錄,而是一個(gè)workspace的工作目錄.而Project是workspace的子目錄,所以.git目錄不應(yīng)該放到Project的根目錄下,而應(yīng)該放到workspace的根目錄下。在workspace目錄下放一個(gè).git目錄有很多好處,比如可以同時(shí)追蹤多個(gè)項(xiàng)目的源代碼,比如可以在刪除workspace時(shí)同時(shí)刪除.git目錄。但是在Eclipse遍歷workspace的時(shí)候,.git目錄的存在會(huì)不會(huì)出現(xiàn)問(wèn)題還說(shuō)不準(zhǔn)。所以最好的辦法是把.git目錄、Project目錄放到workspace之外。如上所述,按Eclipse的哲學(xué),.git目錄不應(yīng)該是Project的子目錄,而是Project的平級(jí)目錄,那么當(dāng).git目錄和Project目錄都放到workspace之外的話,總得有一個(gè)目錄來(lái)存放它們吧,Eclipse就把這個(gè)存放它們的那個(gè)目錄叫Repository。其概念和Git中原有的Repository概念不一樣,Eclipse的Repository不是指.git目錄,而是Project目錄的父目錄,在Eclipse中,.git目錄叫metadata folder,如果和Git中的Repository是Project的子目錄的概念相比較,這兩個(gè)Repository的概念差了兩個(gè)輩份。

            如下圖,將Project納入Git管理,選擇快捷菜單Team->Share Project命令彈出的對(duì)話框:


            在這個(gè)對(duì)話框,有一個(gè)Use or create repository in parent folder of project的單選框,這里的repository就是指.git目錄的祖父目錄,所以選中這個(gè)單選框,則workspace就相當(dāng)于是repository,而.git目錄就會(huì)放到Project目錄下。這和我們平時(shí)單獨(dú)使用Git的習(xí)慣是一致的,比較容易理解,但是卻是Eclipse不推薦的。

            按照Eclipse的哲學(xué),我們應(yīng)該點(diǎn)這個(gè)對(duì)話框中的Create按鈕,這樣會(huì)彈出如下對(duì)話框:


            按照我上面這么填寫(xiě)后,相當(dāng)于創(chuàng)建了一個(gè)Repository,其路徑為/home/youxia/git/examples,.git目錄就會(huì)創(chuàng)建在這個(gè)目錄下,Project目錄也會(huì)移動(dòng)到這個(gè)目錄下,而workspace依然不變。點(diǎn)Finish,會(huì)返回上一個(gè)對(duì)話框,可以看到下面的表格中,顯示該項(xiàng)目的current location為/home/youxia/workspace/rcp-example,而創(chuàng)建Repository后,將會(huì)將該項(xiàng)目移動(dòng)到/home/youxia/git/examples/rcp-example,.git目錄和rcp-example的項(xiàng)目目錄是平級(jí)的,都是examples的子目錄,examples就是Repository。而且使用這一個(gè).git目錄,可以追蹤多個(gè)項(xiàng)目,也就是說(shuō),以后凡是我為了做示范寫(xiě)的代碼,不管是swt-example也好,還是springside-example也好,都可以放到examples下,用這一個(gè).git目錄保管他們的版本庫(kù)。


            為了證明我沒(méi)有誤解Eclipse的哲學(xué),下面是EGit/User Guidehttp://wiki.eclipse.org/EGit/User_Guide)的部分原文:

          Eclipse Workspace and Repository working directory 
           Git Repositories can be created in different ways
          , for example by cloning from an existing Repository, by creating one from scratch, or by using the EGit Sharing wizard. 
           In any case (unless you create a 
          "bare" Repository, but that's not discussed here), the new Repository is essentially a folder on the local hard disk which contains the "working directory" and the metadata folder. The metadata folder is a dedicated child folder named ".git" and often referred to as ".git-folder". It contains the actual repository (i.e. the Commits, the References, the logs and such). 
           The metadata folder is totally transparent to the Git client
          , while the working directory is used to expose the currently checked out Repository content as files for tools and editors. 

            另一段,關(guān)于.git目錄不應(yīng)該放到Project目錄下,而應(yīng)該和Project目錄平級(jí),并放到workspace之外的:

          It is probably not a good idea to make a project the root folder of your Repository 
           The reason is that you will never be able to add another project to this Repository
          , as the .project file will occupy the root folder; you could still add projects as sub-folders, but this kind of project nesting is known to cause lots of problems all over the place. In order to add another project, you would have to move the project to a sub-folder in the Repository and add the second project as another sub-folder before you could commit this change.  
          It is a good idea to keep your Repository outside of your Eclipse Workspace 
           There are several reasons for this: The new Repository will consider the complete folder structure of the Eclipse workspace as (potential) content. This can result in performance issues
          , for example when calculating the changes before committing (which will scan the complete .metadata folder, for example); more often than not, the workspace will contain dead folders (e.g. deleted projects) which semantically are not relevant for EGit but can not be excluded easily. 
           The metadata (.git-) folder will be a child of the Eclipse Workspace. It is unclear whether this might cause unwanted folder traversals by Eclipse. 
           You can easily destroy your Repository by destroying your Eclipse Workspace 


            這里面的細(xì)微差別可能會(huì)在使用EGit的過(guò)程中產(chǎn)生極大困惑。我將其作為重要內(nèi)容補(bǔ)充道博文末尾,希望能對(duì)大家有所幫助。


          評(píng)論

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成  回復(fù)  更多評(píng)論   

          2013-12-30 11:43 by Sha Jiang
          現(xiàn)在不是流行用Gradle了嘛,嘿嘿

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-12-30 12:34 by 海邊沫沫
          @Sha Jiang
          多謝指點(diǎn)。又讓我學(xué)到新東西了。

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成  回復(fù)  更多評(píng)論   

          2013-12-30 13:46 by 干眼
          現(xiàn)在還是JAVA用的比較多吧,我們老師都是這么說(shuō)的。

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成  回復(fù)  更多評(píng)論   

          2013-12-30 15:38 by 鵬達(dá)鎖業(yè)
          對(duì)大部分人來(lái)說(shuō),使用插件非常簡(jiǎn)單

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成  回復(fù)  更多評(píng)論   

          2013-12-31 10:51 by 鵬達(dá)鎖業(yè)
          這片神秘土地形形色色的人以及他們不為人知的生活方式

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-12-31 11:12 by 海邊沫沫
          @鵬達(dá)鎖業(yè)
            --------------------------
            這片神秘土地形形色色的人以及他們不為人知的生活方式
            --------------------------

          What?

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-12-31 12:06 by landon
          ant+ivy 可否一戰(zhàn)?

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成  回復(fù)  更多評(píng)論   

          2014-01-01 12:16 by 私人訂制
          一直用不習(xí)慣GIT的飄過(guò) 哈哈

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成  回復(fù)  更多評(píng)論   

          2015-08-22 10:12 by zuidaima
          可以參考最新的文檔:
          如何在eclipse jee中檢出項(xiàng)目并轉(zhuǎn)換為Maven project,最后轉(zhuǎn)換為Dynamic web project,地址:http://zuidaima.com/blog/1618180875144192.htm
          如何在eclipse jee中創(chuàng)建Maven project并且轉(zhuǎn)換為Dynamic web project
          地址:http://zuidaima.com/blog/1618162161323008.htm

          # re: 淺論Maven和Git的原理及展示其與Eclipse的集成  回復(fù)  更多評(píng)論   

          2015-11-27 13:44 by laowang
          就是單純的表示下 感謝! 入門(mén)階段看了很多介紹 從你這里收貨最大!多謝!
          主站蜘蛛池模板: 千阳县| 长岛县| 锡林浩特市| 乌兰察布市| 南华县| 孝感市| 奉新县| 遂宁市| 紫金县| 沙湾县| 郑州市| 永吉县| 开封县| 武邑县| 丽水市| 寻乌县| 醴陵市| 阳东县| 遵义市| 武冈市| 咸宁市| 荣成市| 喀喇沁旗| 苍山县| 堆龙德庆县| 依兰县| 如皋市| 谢通门县| 武山县| 贡觉县| 长泰县| 寿宁县| 丁青县| 济南市| 南涧| 台江县| 屏东县| 新兴县| 阿鲁科尔沁旗| 水富县| 体育|