轉(zhuǎn)載地址:http://www.infoq.com/cn/news/2011/04/xxb-maven-6-gradle

          Maven面臨的挑戰(zhàn)

          軟件行業(yè)新舊交替的速度之快往往令人咂舌,不用多少時(shí)間,你就會(huì)發(fā)現(xiàn)曾經(jīng)大紅大紫的技術(shù)已經(jīng)成為了昨日黃花,當(dāng)然,Maven也不會(huì)例外。雖然目前它基本上是Java構(gòu)建的事實(shí)標(biāo)準(zhǔn),但我們也能看到新興的工具在涌現(xiàn),比如基于Goovy的Gradle,而去年Hibernate宣布從Maven遷移至Gradle這 一事件更是吸引了不少眼球。在此之前,我也聽到了不少對(duì)Maven的抱怨,包括XML的繁冗,不夠靈活,學(xué)習(xí)曲線陡峭等等。那Gradle是否能夠在繼承 Maven優(yōu)點(diǎn)的基礎(chǔ)上,克服這些缺點(diǎn)呢?帶著這個(gè)疑問,我開始閱讀Gradle的文檔并嘗試著將一個(gè)基于Maven的項(xiàng)目轉(zhuǎn)成用Gradle構(gòu)建,本文 所要講述大概就是這樣的一個(gè)體驗(yàn)。需要注意的是,本文完全是基于Maven的角度來(lái)看Gradle的,因此對(duì)于Ant用戶來(lái)說(shuō),視角肯定會(huì)大有不同。

          Gradle初體驗(yàn)

          Gradle的安裝非常方便,下載ZIP包,解壓到本地目錄,設(shè)置 GRADLE_HOME 環(huán)境變量并將 GRADLE_HOME/bin 加到 PATH 環(huán)境變量中,安裝就完成了。用戶可以運(yùn)行gradle -v命令驗(yàn)證安裝,這些初始的步驟和Maven沒什么兩樣。Gradle目前的版本是1.0-milestone-1,根據(jù)其Wiki上的Roadmap,在1.0正式版發(fā)布之前,還至少會(huì)有3個(gè)里程碑版本,而1.0的發(fā)布日期最快也不會(huì)早于6月份。而正是這樣一個(gè)看起來(lái)似乎還不怎么成熟的項(xiàng)目,卻有著讓很多成熟項(xiàng)目都汗顏的文檔,其包括了安裝指南、基本教程、以及一份近300頁(yè)的全面用戶指南。這對(duì)于用戶來(lái)說(shuō)是非常友好的,同時(shí)也說(shuō)明了Gradle的開發(fā)者對(duì)這個(gè)項(xiàng)目非常有信心,要知道編寫并維護(hù)文檔可不是件輕松的工作,對(duì)于Gradle這樣未來(lái)仍可能發(fā)生很大變動(dòng)的項(xiàng)目來(lái)說(shuō)尤為如此。

          類似于Maven的pom.xml文件,每個(gè)Gradle項(xiàng)目都需要有一個(gè)對(duì)應(yīng)的build.gradle文件,該文件定義一些任務(wù)(task)來(lái)完成構(gòu)建工作,當(dāng)然,每個(gè)任務(wù)是可配置的,任務(wù)之間也可以依賴,用戶亦能配置缺省任務(wù),就像這樣:

          復(fù)制代碼
          defaultTasks 'taskB'  task taskA << {     println "i'm task A" }  task taskB << {     println "i'm task B, and I depend on " + taskA.name }  taskB.dependsOn taskA
          復(fù)制代碼

          運(yùn)行命令$ gradle -q之后(參數(shù)q讓Gradle不要打印錯(cuò)誤之外的日志),就能看到如下的預(yù)期輸出:

          i'm task A i'm task B, and I depend on taskA

          這不是和Ant如出一轍么?的確是這樣,這種“任務(wù)”的概念與用法與Ant及其相似。Ant任務(wù)是Gradle世界的第一公民,Gradle對(duì) Ant做了很好的集成。除此之外,由于Gradle使用的Grovvy腳本較XML更為靈活,因此,即使我自己不是Ant用戶,我也仍然覺得Ant用戶會(huì) 喜歡上Gradle。

          依賴管理和集成Maven倉(cāng)庫(kù)

          我們知道依賴管理、倉(cāng)庫(kù)、約定優(yōu)于配置等概念是Maven的核心內(nèi)容,拋開其實(shí)現(xiàn)是否最優(yōu)不談,概念本身沒什么問題,并且已經(jīng)被廣泛學(xué)習(xí)和接受。那Gradle實(shí)現(xiàn)了這些優(yōu)秀概念了么?答案是肯定的。

          先看依賴管理,我有一個(gè)簡(jiǎn)單的項(xiàng)目依賴于一些第三方類庫(kù)包括SpringFramework、JUnit、Kaptcha等等。原來(lái)的Maven POM配置大概是這樣的(篇幅關(guān)系,省略了部分父POM配置):

          復(fù)制代碼
             <properties>         <kaptcha.version>2.3</kaptcha.version>     </properties>      <dependencies>         <dependency>             <groupId>com.google.code.kaptcha</groupId>             <artifactId>kaptcha</artifactId>             <version>${kaptcha.version}</version>             <classifier>jdk15</classifier>         </dependency>         <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-core</artifactId>         </dependency>         <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-beans</artifactId>         </dependency>         <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-context</artifactId>         </dependency>         <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>         </dependency>     </dependencies>
          復(fù)制代碼

          然后我將其轉(zhuǎn)換成Gradle腳本,結(jié)果是驚人的:

          復(fù)制代碼
          dependencies {     compile('org.springframework:spring-core:2.5.6')     compile('org.springframework:spring-beans:2.5.6')     compile('org.springframework:spring-context:2.5.6')     compile('com.google.code.kaptcha:kaptcha:2.3:jdk15')     testCompile('junit:junit:4.7') }
          復(fù)制代碼

          注意配置從原來(lái)的28行縮減至7行!這還不算我省略的一些父POM配置。依賴的groupId、artifactId、 version,scope甚至是classfier,一點(diǎn)都不少。較之于Maven或者Ant的XML配置腳本,Gradle使用的Grovvy腳本殺 傷力太大了,愛美之心,人皆有之,相比于七旬老婦松松垮垮的皺紋,大家肯定都喜歡少女緊致的臉蛋,XML就是那老婦的皺紋。

          關(guān)于Gradle的依賴管理起初我有一點(diǎn)擔(dān)心,就是它是否有傳遞性依賴的機(jī)制呢?經(jīng)過(guò)文檔閱讀和實(shí)際試驗(yàn)后,這個(gè)疑慮打消了,Gradle能夠解析 現(xiàn)有的Maven POM或者Ivy的XML配置,從而得到傳遞性依賴的信息,并且引入到當(dāng)前項(xiàng)目中,這實(shí)在是一個(gè)聰明的做法。在此基礎(chǔ)上,它也支持排除傳遞性依賴或者干脆 關(guān)閉傳遞性依賴,其中第二點(diǎn)是Maven所不具備的特性。

          自動(dòng)化依賴管理的基石是倉(cāng)庫(kù),Maven中央倉(cāng)庫(kù)已經(jīng)成為了Java開發(fā)者不可或缺的資源,Gradle既然有依賴管理,那必然也得用到倉(cāng)庫(kù),這當(dāng)然也包括了Maven中央倉(cāng)庫(kù),就像這樣:

          repositories {     mavenLocal()     mavenCentral()     mavenRepo urls: "http://repository.sonatype.org/content/groups/forge/" }

          這段代碼幾乎不用解釋,就是在Gradle中配置使用Maven本地倉(cāng)庫(kù)、中央倉(cāng)庫(kù)、以及自定義地址倉(cāng)庫(kù)。在我實(shí)際構(gòu)建項(xiàng)目的時(shí)候,能看到終端打印的下載信息,下載后的文件被存儲(chǔ)在 USER_HOME/.gradle/cache/ 目錄下供項(xiàng)目使用,這種實(shí)現(xiàn)的方法與Maven又是及其類似了,可以說(shuō)Gradle不僅最大限度的繼承Maven的很多理念,倉(cāng)庫(kù)資源也是直接拿來(lái)用。

          Gradle項(xiàng)目使用Maven項(xiàng)目生成的資源已經(jīng)不是個(gè)問題了,接著需要反過(guò)來(lái)考慮,Maven用戶是否能夠使用 Gradle生成的資源呢?或者更簡(jiǎn)單點(diǎn)問,Gradle項(xiàng)目生成的構(gòu)件是否可以發(fā)布到Maven倉(cāng)庫(kù)中供人使用呢?這一點(diǎn)非常重要,因?yàn)槿绻霾坏竭@一 點(diǎn),你可能就會(huì)丟失大量的用戶。幸運(yùn)的是Gradle再次給出了令人滿意的答案。使用Gradle的Maven Plugin,用戶就可以輕松地將項(xiàng)目構(gòu)件上傳到Maven倉(cāng)庫(kù)中:

          復(fù)制代碼
          apply plugin: 'maven' ... uploadArchives {     repositories.mavenDeployer {         repository(url: "http://localhost:8088/nexus/content/repositories/snapshots/") {             authentication(userName: "admin", password: "admin123")             pom.groupId = "com.juvenxu"             pom.artifactId = "account-captcha"         }     } }
          復(fù)制代碼

          在上傳的過(guò)程中,Gradle能夠基于build.gradle生成對(duì)應(yīng)的Maven POM文件,用戶可以自行配置POM信息,比如這里的groupId和artifactId,而諸如依賴配置這樣的內(nèi)容,Gradle是會(huì)自動(dòng)幫你進(jìn)行轉(zhuǎn) 換的。由于Maven項(xiàng)目之間依賴交互的直接途徑就是倉(cāng)庫(kù),而Gradle既能夠使用Maven倉(cāng)庫(kù),也能以Maven的格式將自己的內(nèi)容發(fā)布到倉(cāng)庫(kù)中, 因此從技術(shù)角度來(lái)說(shuō),即使在一個(gè)基于Maven的大環(huán)境中,局部使用Gradle也幾乎不會(huì)是一個(gè)問題。

          約定優(yōu)于配置

          如同Ant一般,Gradle給了用戶足夠的自由去定義自己的任務(wù),不過(guò)同時(shí)Gradle也提供了類似Maven的約定由于配置方式,這是通過(guò) Gradle的Java Plugin實(shí)現(xiàn)的,從文檔上看,Gradle是推薦這種方式的。Java Plugin定義了與Maven完全一致的項(xiàng)目布局:

          • src/main/java

          • src/main/resources

          • src/test/java

          • src/test/resources

          區(qū)別在于,使用Groovy自定義項(xiàng)目布局更加的方便:

          復(fù)制代碼
          sourceSets {     main {         java {             srcDir 'src/java'         }         resources {             srcDir 'src/resources'         }     } }
          復(fù)制代碼

          Gradle Java Plugin也定義了構(gòu)建生命周期,包括編譯主代碼、處理資源、編譯測(cè)試代碼、執(zhí)行測(cè)試、上傳歸檔等等任務(wù):

          Figure 1. Gradle的構(gòu)建生命周期

          相對(duì)于Maven完全線性的生命周期,Gradle的構(gòu)建生命周期略微復(fù)雜,不過(guò)也更為靈活,例如jar這個(gè)任務(wù)是用來(lái)打包的,它不像Maven那 樣依賴于執(zhí)行測(cè)試的test任務(wù),類似的,從圖中可以看到,一個(gè)最終的build任務(wù)也沒有依賴于uploadArchives任務(wù)。這個(gè)生命周期并沒有 將用戶限制得很死,舉個(gè)例子,我希望每次build都發(fā)布 SNAPSHOT版本到Maven倉(cāng)庫(kù)中,而且我只想使用最簡(jiǎn)單的$ gradle clean build命令,那只需要添加一行任務(wù)依賴配置即可:

          build.dependsOn 'uploadArchives'

          小結(jié)

          一番體驗(yàn)下來(lái),Gradle給我最大的感覺是兩點(diǎn)。其一是簡(jiǎn)潔,基于Groovy的緊湊腳本實(shí)在讓人愛不釋手,在表述意圖方面也沒有什么不清晰的地 方。其二是靈活,各種在Maven中難以下手的事情,在Gradle就是小菜一碟,比如修改現(xiàn)有的構(gòu)建生命周期,幾行配置就完成了,同樣的事情,在 Maven中你必須編寫一個(gè)插件,那對(duì)于一個(gè)剛?cè)腴T的用戶來(lái)說(shuō),沒個(gè)一兩天幾乎是不可能完成的任務(wù)。

          不過(guò)即使如此,Gradle在未來(lái)能否取代Maven,在我看來(lái)也還是個(gè)未知數(shù)。它的一大障礙就是Grovvy,幾乎所有 Java開發(fā)者都熟悉XML,可又有幾個(gè)人了解Groovy呢?學(xué)習(xí)成本這道坎是很難跨越的,很多人抵制Maven就是因?yàn)閷W(xué)起來(lái)不容易,你現(xiàn)在讓因?yàn)橐?個(gè)構(gòu)建工具學(xué)習(xí)一門新語(yǔ)言(即使這門語(yǔ)言和Java非常接近),那得到冷淡的回復(fù)幾乎是必然的事情。Gradle的另外一個(gè)問題就是它太靈活了,雖然它支 持約定優(yōu)于配置,不過(guò)從本文你也看到了,破壞約定是多么容易的事情。人都喜歡自由,愛自定義,覺得自己的需求是多么的特別,可事實(shí)上,從Maven的流行 來(lái)看,幾乎95%以上的情況你不需要自行擴(kuò)展,如果你這么做了,只會(huì)讓構(gòu)建變得難以理解。從這個(gè)角度來(lái)看,自由是把雙刃劍,Gradle給了你足夠的自 由,約定優(yōu)于配置只是它的一個(gè)選項(xiàng)而已,這初看起來(lái)很誘人,卻也可能使其重蹈Ant的覆轍。Maven在Ant的基礎(chǔ)上引入了依賴管理、倉(cāng)庫(kù)以及約定優(yōu)于 配置等概念,是一個(gè)很大的進(jìn)步,不過(guò)在我現(xiàn)在看來(lái),Gradle并沒有引入新的概念,給我感覺它是一個(gè)結(jié)合Ant和Maven理念的優(yōu)秀實(shí)現(xiàn)。

          如果你了解Groovy,也理解Maven的約定優(yōu)于配置,那試試Gradle倒也不錯(cuò),尤其是它幾乎能和現(xiàn)有的Maven系統(tǒng)無(wú)縫集成,而且你也能享受到簡(jiǎn)潔帶來(lái)的極大樂趣。其實(shí)說(shuō)到簡(jiǎn)潔,也許在不久的將來(lái)Maven用戶也能直接享受到,Polyglot Maven在 這方面已經(jīng)做了不少工作。本文完全基于Maven的視角介紹Gradle這一構(gòu)建工具的新秀,不過(guò)限于篇幅原因,無(wú)法深入Gradle的方方面面,例如 Gradle也支持多模塊構(gòu)建,它提供了GUI操作界面,支持Grovvy(理所當(dāng)然)和Scala項(xiàng)目等等。有興趣的讀者可以自行進(jìn)一步了解。

          關(guān)于作者

          許曉斌(Juven Xu),國(guó)內(nèi)社區(qū)公認(rèn)的Maven技術(shù)專家、Maven中文用戶組創(chuàng)始人、Maven技術(shù)的先驅(qū)和積極推動(dòng)者,著有《Maven實(shí)戰(zhàn)》一 書。對(duì)Maven有深刻的認(rèn)識(shí),實(shí)戰(zhàn)經(jīng)驗(yàn)豐富,不僅撰寫了大量關(guān)于Maven的技術(shù)文章,而且還翻譯了開源書籍《Maven權(quán)威指南》,對(duì)Maven技術(shù) 在國(guó)內(nèi)的普及和發(fā)展做出了很大的貢獻(xiàn)。就職于Maven之父的公司,負(fù)責(zé)維護(hù)Maven中央倉(cāng)庫(kù),是Maven倉(cāng)庫(kù)管理器Nexus(著名開源軟件)的核 心開發(fā)者之一,曾多次受邀到淘寶等大型企業(yè)開展Maven方面的培訓(xùn)。此外,他還是開源技術(shù)的積極倡導(dǎo)者和推動(dòng)者,擅長(zhǎng)Java開發(fā)和敏捷開發(fā)實(shí)踐。他的 個(gè)人網(wǎng)站是:http://www.juvenxu.com

          分類: Gradle
          posted @ 2014-10-28 16:00 小馬歌 閱讀(244) | 評(píng)論 (0)編輯 收藏
           
          1、安裝 
              Gradle安裝和Maven一樣方便,只需要,下載(http://www.gradle.org/downloads )==》解壓==》配置環(huán)境變量(GRADLE_HOME & PATH),配置好環(huán)境變量之后記得使用 source命令使新的環(huán)境變量生效。配置成功之后,可以在命令行通過(guò) “gradle -v"驗(yàn)證是否安裝成功。 

          2、Gradle編譯Maven風(fēng)格的java項(xiàng)目 
              首先,在項(xiàng)目根目錄創(chuàng)建"build.gradle"文件,編譯java項(xiàng)目需要使用gradle的java插件
          Groovy代碼  收藏代碼
          1. apply plugin: 'java'  
          ,因?yàn)橐蒻aven的功能,需要添加maven插件
          Groovy代碼  收藏代碼
          1. apply plugin: 'maven'[   
          。 
              接著,配置項(xiàng)目的Repository,風(fēng)格如下
          Groovy代碼  收藏代碼
          1. repositories{  
          2.          mavenCentral();  
          3.     }  
          ,上面例子使用的是默認(rèn)的maven的中央庫(kù),如果想用自己的本地庫(kù),可通過(guò)如下方式配置
          Groovy代碼  收藏代碼
          1. def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath  
          2. repositories {  
          3.     // Use local Maven repo location. We don't need this if we only want to install  
          4.     // an artifact, but we do need it if we want to use dependencies from the local  
          5.     // repository.  
          6.     mavenRepo urls: localMavenRepo  
          7.     mavenCentral()  
          8. }  


              再然后,配置項(xiàng)目依賴的第三方庫(kù),配置模板如下:
          Groovy代碼  收藏代碼
          1. dependencies{  
          2.           compile group: '<group-id>',name:'<artifact-id>',version:'<version>'  
          3.      }  
          ,舉個(gè)例子,假設(shè)項(xiàng)目依賴了4.10版本的junit,那么配置就是
          Groovy代碼  收藏代碼
          1. compile group: 'junit',name:'junit',version:'4.10'  
          另外Depencies還可以按如下方式簡(jiǎn)寫
          Groovy代碼  收藏代碼
          1. compile  '<group-id>:<artifact-id>:<version>'  
          例子
          Groovy代碼  收藏代碼
          1. compile  'junit:junit:4.10'  


              最后,如何把自己的項(xiàng)目發(fā)布到Repository中,
          Groovy代碼  收藏代碼
          1. uploadArchives {  
          2.    repositories {  
          3.        mavenDeployer {  
          4.            repository(url: "file://localhost/tmp/myRepo/")  
          5.        }  
          6.    }   
          posted @ 2014-10-28 15:49 小馬歌 閱讀(908) | 評(píng)論 (0)編輯 收藏
           
               摘要: 一、尋找gradle的歷程一開始的時(shí)候,我們只有一個(gè)工程,所有要用到的jar包都放到工程目錄下面,時(shí)間長(zhǎng)了,工程越來(lái)越大,使用到的jar包也越來(lái)越多,難以理解jar之間的依賴關(guān)系。再后來(lái)我們把舊的工程拆分到不同的工程里,靠ide來(lái)管理工程之間的依賴關(guān)系,各工程下的jar包依賴是雜亂的。一段時(shí)間后,我們發(fā)現(xiàn)用ide來(lái)管理項(xiàng)程很不方便,比如不方便脫離ide自動(dòng)構(gòu)建,于是我們寫自己的ant腳本。再后來(lái),...  閱讀全文
          posted @ 2014-10-28 15:47 小馬歌 閱讀(891) | 評(píng)論 (0)編輯 收藏
           

          MavenVsGradle

          版本3  單擊查看文檔歷史記錄
          創(chuàng)建于: 2009-6-18 下午5:02 作者 Paul Gier - 最后修改:  2010-3-17 下午3:11 作者 Paul Gier

          本文比較了兩個(gè)構(gòu)建工具:Maven和Gradle,并討論了各自的優(yōu)點(diǎn)和缺點(diǎn)。

          Maven簡(jiǎn)介

          Maven是一種掃大街的大媽都知道的Java構(gòu)建工具。 如果你還不知道Maven是神馬,可以去這嘎達(dá)看看。 Maven提供了一套大多數(shù)項(xiàng)目都適用的基本的配置方案。 Maven提供的構(gòu)建過(guò)程可以默認(rèn),也可以在有需要時(shí)候定制。 這樣做的好處是讓生成配置文件(POM)變得很簡(jiǎn)單。 缺點(diǎn)是當(dāng)涉及到自定義構(gòu)建流程時(shí),Maven就變得有局限性鳥。

          Gradle簡(jiǎn)介

          Gradle 是一個(gè)較新的構(gòu)建工具基于Ant和Groovy。 Gradle提供了一些默認(rèn)配置方案,比Maven更加靈活。 生命周期相關(guān)的一切構(gòu)建都可以自定義。 有這玩意,你會(huì)覺得很爽的

          比較

           

          Maven使用XML來(lái)定義生成腳本。和Ant一樣,這是一個(gè)安全的選擇,因?yàn)榇蠖鄶?shù)人都熟悉XML配置。 Gradle構(gòu)建腳本是用Groovy寫的。 用XML優(yōu)勢(shì)在于它可以更方便地定義構(gòu)建邏輯是比較復(fù)雜的步驟不僅僅是不變的一系列。 用Groovy的好處就是寫起來(lái)比XML標(biāo)簽簡(jiǎn)潔得多。 Groovy的毛病就是熟悉的XML的開發(fā)人員比groovy的多,這些爺們必需自己來(lái)寫復(fù)雜的邏輯。

          性能

           

          一些 非正式的測(cè)試 表明Gradle 比Maven性能高不了,甚至還低一點(diǎn)。 讓人抓狂的是這倆兄弟都似乎要明顯慢于Ant。 使用Maven構(gòu)建JBoss應(yīng)用服務(wù)器比用Ant構(gòu)建要多兩倍的時(shí)間。

          (Ant是明顯的贏家,Maven和Gradle大約相同)

          譯者注:使用Gradle,在一個(gè)task里寫了個(gè)循環(huán) 調(diào)用flex的mxmlc,才編譯3個(gè)mxml文件,丫的就出現(xiàn)了Java heap space錯(cuò)誤了。情何以堪啊

           

          依賴配置

           

          通常的Maven項(xiàng)目有一個(gè)單一的依賴的靜態(tài)配置, 所以一個(gè)項(xiàng)目應(yīng)該有只有一個(gè)單一的Artifact。 簡(jiǎn)單就是他的優(yōu)勢(shì),但也缺乏彈性。 Gradle在這方面的更靈活。 可以在創(chuàng)建和處理的時(shí)候有多套依賴配置。 

          (Gradle因?yàn)楹?jiǎn)單性和靈活性獲勝,Maven和 Ant/Ivy次之)

           

          使用Artifact倉(cāng)庫(kù)

           

          Maven有自己的單一倉(cāng)庫(kù)格式。 Gradle可以使用Ivy倉(cāng)庫(kù)和Maven倉(cāng)庫(kù)。 部署到Maven倉(cāng)庫(kù)是非常容易,Ant和Gradle就需要你多動(dòng)動(dòng)腦經(jīng)了。

          (Maven Win,Gradle和Ant/Ivy老二)

           

          加載構(gòu)建系統(tǒng)的組件

           

          Maven采取的做法是每個(gè)用于構(gòu)建的組件(編譯/jar等​​)都作為一個(gè)插件。 每個(gè)插件都有它自己的版本和依賴關(guān)系樹。 Gradle的構(gòu)建系統(tǒng)組件都是分散的。 Maven插件的優(yōu)點(diǎn)是在于可以獨(dú)立更新,無(wú)需整個(gè)系統(tǒng)更新。Gradle的模型的優(yōu)點(diǎn)是,編譯需要核心組件以外的組件時(shí)才下載。

           

          Maven和Gradle在這點(diǎn)上都比Ant好。 Ant需要Ivy和一些麻煩的配置來(lái)實(shí)現(xiàn)。

          (Maven和Gradle并列,Ant第二因?yàn)樗枰嗟脑O(shè)置來(lái)加載額外的構(gòu)建組件)

          譯者注:少造輪子

           

          構(gòu)建生命周期

          Maven提供有限的構(gòu)建生命周期訪問。 插件可以連接到生命周期的特定階段,而且只有在核心插件執(zhí)行。 Gradle很容易這方面NB,因?yàn)樗梢暂p松地訪問任何生成的一部分,并允許用Groovy代碼處理。Ant也可以訪問任何一部分構(gòu)建,但是需要用任務(wù)來(lái)實(shí)現(xiàn)而不是代碼,所以還是不如Gradle強(qiáng)大。

          (Gradle毫無(wú)鴨梨,Ant老二,Maven最渣)

           

          翻譯至  http://community.jboss.org/wiki/MavenVsGradle
          posted @ 2014-10-28 15:43 小馬歌 閱讀(2846) | 評(píng)論 (0)編輯 收藏
           
          from:http://code.google.com/p/android-application-plug-ins-frame-work/

          介紹

          這個(gè)框架的初衷,是為了方便讓程序模塊化、插件化,將一個(gè)apk應(yīng)用拆分為多個(gè)apk。
          不明白這個(gè)插件化、模塊化是怎么回事的話,可以看看騰訊微信的安卓客戶端中的插件配置。
          在這里我會(huì)以騰訊微信為例,如何使用這個(gè)框架。 (騰訊微信并不是真正的插件化,它是偽的,插件并非與它的主程序分離開,結(jié)果就是每次插件的更新,都必須以整個(gè)程序的更新為代價(jià))

          都能干啥

          框架的思想,主要是通過(guò)apk清單文件中的sharedUserId屬性來(lái)吧多個(gè)apk融合為單一的dalvik虛擬機(jī),也就是融合為一個(gè)進(jìn)程,這樣就變相逾越了android框架中不同apk權(quán)限不同無(wú)法互通的鴻溝(rpc啦什么的其它的畢竟不如這個(gè)來(lái)的實(shí)在)。
          從最簡(jiǎn)單的皮膚插件到復(fù)雜的涉及數(shù)據(jù)庫(kù)的拓展功能,從普通activity跳轉(zhuǎn)到把插件的activity轉(zhuǎn)變?yōu)関iew并附加到主程序中的拓展功能,都是可以通過(guò)本框架來(lái)實(shí)現(xiàn)的,當(dāng)然,本框架只是提供了一種途徑,如何編碼還得靠自己。
          本人能力有限,可能有一些錯(cuò)誤、疏漏或者不足之處,請(qǐng)不吝指教,我的博客地址在左下角,或者我的郵箱,都可以聯(lián)系到我。
          ps:下面會(huì)以騰訊微信為例,這里聲明一下,本人沒有對(duì)微信安卓客戶端進(jìn)行任意形式的反編譯與破解工作,只是看球半天進(jìn)行簡(jiǎn)單的猜測(cè)而已。

          框架結(jié)構(gòu)

          本插件框架由三個(gè)包組成:

          • org.igeek.android.pluginframework 這個(gè)包種類是框架的主要操作類
            1. PluginBuilder 組裝插件
            2. PluginDescription 組裝用戶自定義的插件描述
            3. PluginInvoke 插件功能調(diào)用
            4. PluginSearch 查找插件
          • org.igeek.android.pluginframework.annotation 未來(lái)可能會(huì)考慮使用注解
            1. PluginDescription 用于用戶自定義描述類的注解
            2. PluginFeature 用于插件類的注解
            3. PluginMethod 用于插件類方法的注解
          • org.igeek.android.pluginframework.beans 框架內(nèi)部使用的一些beans
            1. Plugin 插件包
            2. PluginFeature 插件類
            3. PluginFeatureMethod 插件方法
          • org.igeek.android.pluginframework.util 一些工具類
            1. XMLParse 插件包

          如何使用

          以騰訊微信為例,雖然從表面來(lái)看,它是插件化的多種功能的一種集成。但是,這都是虛的,每次更新時(shí)你會(huì)發(fā)現(xiàn),哪怕一個(gè)小小的功能添加,都會(huì)讓用戶更新整個(gè)程序,截至目前(2011-12-17),微信讓我更新到3.5,修復(fù)了一些小bug,增加了1個(gè)插件功能,以及其它的小改進(jìn),就得讓我下載并升級(jí)整個(gè)程序,6.8m啊。。
          在工程開發(fā)時(shí),預(yù)留插件的使用、管理頁(yè)面,如:

          這是微信的插件瀏覽頁(yè)面,所有可暴露在這里的插件都會(huì)被列出來(lái)

           這是微信的插件管理界面,可以卸載安卓,但這些都是虛的,可能只是把服務(wù)關(guān)了,并非真正的卸載

          主程序(APK)

          • 、主程序清單
          首先為工程想好一個(gè)名字,并在清單中加入sharedUserId屬性,屬性值就是想好的那個(gè)名字,例如微信:com.qq.weixin
             android:sharedUserId="com.qq.weixin"
          • 、為插件描述寫一個(gè)類
           這就是插件描述

          首先在主程序中單獨(dú)建立一個(gè)包,并寫一個(gè)類,這個(gè)類相當(dāng)于一個(gè)bean,具有相應(yīng)的插件描述信息的字段,如微信,那么這個(gè)bean的字段就有 插件名:漂流瓶 插件logo:那個(gè)人頭 插件描述:描述信息...

          這個(gè)類在主程序中不會(huì)很多的使用,只會(huì)讀取框架返回的插件的bean。

          • 、引入本框架的jar包或?qū)朐创a

          正式編碼時(shí),可在任何地方調(diào)用框架。具體步驟是這樣的
          1、查找插件 本框架是根據(jù)sharedUserId來(lái)查找插件。它首先會(huì)根據(jù)自身apk的sharedUserId值來(lái)查找系統(tǒng)中具有相同屬性的包并加載。
          • ??以說(shuō),插件apk的sharedUserId值也應(yīng)與主程序相同
                  //首先,就是查找插件
                  PluginSearch psearch=new PluginSearch();
                  //第一次獲得的是簡(jiǎn)要的插件描述
                  List<Plugin>  plugins=psearch.getPlugins(this);
                 
                  //然后將插件再組裝一下
                  PluginBuilder pbuilder=new PluginBuilder(this);
                  //將用戶所定義插件描述融合進(jìn)去
                  plugins=pbuilder.buildPluginsDescrition(plugins);

          這樣就把所有插件找到手了,很簡(jiǎn)單吧?

          1、調(diào)用插件 找到插件后肯定是調(diào)用,最簡(jiǎn)單應(yīng)用,就是靠Button按鈕來(lái)調(diào)用
          比如微信的搖一搖,點(diǎn)了它就觸發(fā)框架的插件調(diào)用
                  @Override
                  public void onClick(View v) {
                          //新建一個(gè)插件調(diào)用類
                          PluginInvoke pi=new PluginInvoke(AndroidPluginFrameworkActivity.this);
                 
                         
                          //這是真正的調(diào)用
                          //三個(gè)參數(shù),第一個(gè)是Plugin類型,第二個(gè)是PluginFeature,第三個(gè)PluginFeatureMethod
                          pi.invoke(plug, pf, fm);
                         
                  }
                  });

          插件程序(APK)

          • 、插件程序清單

          同主程序的清單文件一樣,sharedUserId必須有且和主程序的一樣 插件的activity的意圖過(guò)濾描述必須是這樣 示例:

           <intent-filter>
                          <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
          • 、插件程序的功能
          插件可以包含任意類,如同一個(gè)普通的apk工程一樣。
          但是,向主程序提供調(diào)用的類,必須是個(gè)activity,方法必須是無(wú)返回值的,有且只有一個(gè)Context參數(shù),框架會(huì)反射這個(gè)方法,并將主程序的context句柄傳入,也就是,不管你用不用這個(gè)context,他都是被框架傳入的。
          如果主程序規(guī)定了描述類,也就是框架中需要PluginDescription來(lái)調(diào)用的bean,在插件工程中,也必須有主程序這個(gè)bean,包名也必須一樣。插件程序可以直接繼承或者更改這個(gè)bean的字段,方便主程序去獲取這個(gè)插件的描述信息。這種方式,是避過(guò)框架,給主程序一種方便。
          • 、插件程序的plugin.xml配置
          http://android-application-plug-ins-frame-work.googlecode.com/files/plugin.xml plugin.xml不能改名,必須放在工程的 assets 目錄下。
          內(nèi)容大致是這樣:
          <?xml version="1.0" encoding="UTF-8"?>
          <!-- 這個(gè)xml配置文件放在插件工程的 assets 目錄下 -->


          <!-- 插件提供的功能(類) -->
          <plugin-features>

                  <!-- 描述類,這個(gè)是自定義的 -->
                  <!-- 這個(gè)描述類使用戶定義的,在主程序中必須有,插件工程中也必須有,并被繼承 -->
                  <description name="org.pakage.name.and.description.name"/>
                 
                  <!-- 這是一個(gè)功能(類),必須是activity的子類 -->
                  <feature name="org.pakage.name.and.activity.name1">
                 
                          <!-- 這是一個(gè)方法 -->
                          <!-- name 方法名 -->
                          <method need-context="true" name="methodName1" >描述信息</method>
                          <method need-context="true" name="methodName2" >描述信息</method>
                         
                  </feature>
                 
                  <feature name="org.pakage.name.and.activity.name2">
                          <method need-context="true" name="methodName1" >描述信息</method>
                  </feature>
          </plugin-features>
          按著上面的套路來(lái)配置,就很容易了。

          最后

          上面說(shuō)的比較泛,最好還是看看示例工程,里面包含了一個(gè)主程序和兩個(gè)插件擴(kuò)展,總共是4個(gè)工程,也就是說(shuō),在用戶端是4個(gè)apkhttp://android-application-plug-ins-frame-work.googlecode.com/files/demo.zip
          posted @ 2014-10-28 11:21 小馬歌 閱讀(252) | 評(píng)論 (0)編輯 收藏
           
          人工光盤壞道 

          目前最新的加密方法,原理是該VCD帶防盜圈,這個(gè)圈的作用是在光頭讀盤到防盜圈處時(shí)是個(gè)壞道,從物理上讓光驅(qū)讀不過(guò)去,你會(huì)發(fā)現(xiàn)光盤可以顯示容量,但打開目錄卻沒有任何文件,市面上的無(wú)間道2、天地英雄、大塊頭有大智慧等最新VCD都是采用這種加密方法。

          破解方法:

          步驟1:首先我們需要CloneCD這個(gè)軟件,下載地址:天極網(wǎng)下載頻道。注意不能使用NERO等其他光驅(qū)軟件,因?yàn)镹ERO讀不過(guò)壞道,可能造成死機(jī)的情況。

          首次運(yùn)行在Language語(yǔ)言欄內(nèi)選擇SIMP.Chinese,界面顯示為中文。點(diǎn)擊“文件→讀成映像文件”,在彈出的對(duì)話框中選擇物理光驅(qū)的盤符,注意不能選擇虛擬盤符。選擇后CloneCD會(huì)對(duì)整個(gè)VCD進(jìn)行掃描,由于制作的是視頻鏡像,所以選擇multimedia audio cd,然后選擇鏡像文件保存目錄,右面已經(jīng)顯示出掃描后光盤的容量、片斷、軌道數(shù)等一些信息(圖3)。

          CloneCD將讀取的整個(gè)光盤內(nèi)容制作成鏡像文件,中途在記錄框中出現(xiàn)讀取扇區(qū)失敗的信息,同時(shí)光驅(qū)中會(huì)出現(xiàn)咔咔咔咔的響聲音,這個(gè)是正?,F(xiàn)象。cloneCD能制作鏡像的原理就是能真實(shí)地按照1∶1 全盤復(fù)制CD,不管是否有保護(hù)或加密之類,它都會(huì)跳過(guò)人為設(shè)置的壞道把有用部分鏡像制作出來(lái)。

          跳過(guò)壞道大概用時(shí)兩三分鐘,視你的光驅(qū)讀盤能力而定,在顯示跳過(guò)偽扇區(qū)后經(jīng)過(guò)十多分鐘就可以把這個(gè)光盤制作成鏡像文件,最后顯示讀取完成后在目錄下會(huì)出現(xiàn)image.img等四個(gè)文件。

          步驟2:已經(jīng)得到了的IMG鏡像文件,還不能使用其他虛擬光驅(qū)工具來(lái)打開它,這時(shí)你會(huì)發(fā)現(xiàn)還是一無(wú)所獲。接下來(lái)的工作是提取鏡像文件中的視頻文件,我們還需要IsoBuster這個(gè)工具,下載地址:天極網(wǎng)下載頻道運(yùn)行IsoBuster,點(diǎn)擊“file→open image file”來(lái)打開image.img文件,在主界面中應(yīng)該出現(xiàn)光盤的卷標(biāo)和目錄結(jié)構(gòu),在track 01上右擊,選“extract track 01→treat as video onlyextract but filter only m2f2 mpeg video frames(.mpg)”,然后選擇文件存放目錄,最后經(jīng)過(guò)幾分鐘的時(shí)間就得到了原始的MPG視頻文件,用來(lái)復(fù)制VCD或在PC上觀看就任君選擇了。
          如果以上方法還不能解決,說(shuō)明加密的是最新的技術(shù),暫時(shí)還沒破解的方法
          posted @ 2014-10-27 09:45 小馬歌 閱讀(1439) | 評(píng)論 (0)編輯 收藏
           
          from:http://www.ppst.cc/post_info/1389279044687141000000

          • 標(biāo)簽: android Android andriod 開源項(xiàng)目
          posted @ 2014-10-22 19:56 小馬歌 閱讀(212) | 評(píng)論 (0)編輯 收藏
           
               摘要: from:https://typeblog.net/tech/2014/07/22/use-buck-to-build-your-app.htmlbuck 是Facebook推出的一款高效率的Android App/Java項(xiàng)目構(gòu)建工具,目前僅支持 Unix/Linux 平臺(tái)。因?yàn)樗褂枚嗑€程編譯方式,所以相對(duì)于其他的構(gòu)建工具而言編譯時(shí)間可以縮短50%甚至更多。buc...  閱讀全文
          posted @ 2014-10-22 19:34 小馬歌 閱讀(3695) | 評(píng)論 (0)編輯 收藏
           
               摘要: from:http://blog.csdn.net/signmem/article/details/17379427特色MySQL/Galera 是一種多主同步集群,但只限于使用 MySQL/InnoDB 引擎,并具有下面特點(diǎn)同步復(fù)制多個(gè)主服務(wù)器的拓?fù)浣Y(jié)構(gòu)可以在任意節(jié)點(diǎn)上進(jìn)行讀寫自動(dòng)控制成員,自動(dòng)刪除故障節(jié)點(diǎn)自動(dòng)加入節(jié)點(diǎn)真正給予行級(jí)別的并發(fā)復(fù)制調(diào)度客戶連接優(yōu)勢(shì)參考下面基于 DBMS 集群的解決方法...  閱讀全文
          posted @ 2014-10-16 14:18 小馬歌 閱讀(350) | 評(píng)論 (0)編輯 收藏
           

          from:http://www.tuicool.com/articles/2UVBba

          標(biāo)簽: InnoDB MySQL Percona XtraDB Cluster Percoba XtraDB ClusterPercona Software | 發(fā)表時(shí)間:2014-01-19 13:02 | 作者:appleboy

          percona

          本篇文章紀(jì)錄安裝 Percona XtraDB Cluster (簡(jiǎn)稱 PXC) 及搭配 HAProxy 做分散流量系統(tǒng),其實(shí)在業(yè)界已經(jīng)很??吹?HAProxy + MySQL Cluster Database 解決方案,HAProxy 幫您解決負(fù)載平衡,並且偵測(cè)系統(tǒng)是否存活,管理者也就不用擔(dān)心 MySQL 服務(wù)是否會(huì)掛掉。本篇會(huì)著重於 HAProxy 設(shè)定部份,並且紀(jì)錄每一步安裝步驟。之前本作者寫過(guò)一篇 Galera Cluster for MySQL Multi-master Replication ,也可以參考。今天測(cè)試系統(tǒng)都會(huì)以 CentOS 為主,各位讀者可以直接開 Amazone EC2 來(lái)測(cè)試,測(cè)試完成再關(guān)閉即可。

          安裝 Percona XtraDB Cluster

          我們會(huì)使用官方 Percona 及 EPEL repositories 進(jìn)行軟體安裝,底下是 Yum 安裝步驟

          $ yum -y install Percona-XtraDB-Cluster-server Percona-XtraDB-Cluster-client Percona-Server-shared-compat percona-xtrabackup

          如果系統(tǒng)已經(jīng)有安裝過(guò) MariaDB + Galera ,請(qǐng)務(wù)必先移除套件

          完成安裝 PXC 套件後,接著設(shè)定 my.cnf 設(shè)定檔

          [mysqld] server_id=1 wsrep_provider=/usr/lib64/libgalera_smm.so wsrep_cluster_address="gcomm://" wsrep_sst_auth=username:password wsrep_provider_options="gcache.size=4G" wsrep_cluster_name=Percona wsrep_sst_method=xtrabackup wsrep_node_name=db_01 wsrep_slave_threads=4 log_slave_updates innodb_locks_unsafe_for_binlog=1 innodb_autoinc_lock_mode=2

          再開啟第 2 臺(tái)或第 3 臺(tái) PXC 服務(wù)的時(shí)候,務(wù)必確認(rèn)第 1 臺(tái)已經(jīng)正確開啟成功。上面設(shè)定檔是針對(duì)第 1 臺(tái)做設(shè)定,之後新增 Node,請(qǐng)務(wù)必修改wsrep_cluster_address 填上你想要 Join 的 Cluster Server IP Address,另外每臺(tái)的 server_id 及 wsrep_node_name 也會(huì)不同,請(qǐng)務(wù)必注意

          第 2 臺(tái)設(shè)定值

          server_id=2 wsrep_cluster_address=gcomm://192.168.1.100 # replace this with the IP of your first node wsrep_node_name=db_02

          第 3 臺(tái)設(shè)定值

          server_id=2 wsrep_cluster_address=gcomm://192.168.1.100 # replace this with the IP of your first node wsrep_node_name=db_03

          根據(jù) State Snapshot Transfer (簡(jiǎn)稱 SST),我們使用 Xtrabackup ,當(dāng)新的 Node 連上時(shí),就會(huì)開始複製資料到新的 Node 上,成功複製完成,可以看到底下 Log 訊息

          140117 11:56:05 [Note] WSREP: Flow-control interval: [28, 28] 140117 11:56:05 [Note] WSREP: Shifting OPEN -> PRIMARY (TO: 678691) 140117 11:56:05 [Note] WSREP: State transfer required:         Group state: 28e87291-da41-11e2-0800-34a03cad54a7:678691         Local state: 28e87291-da41-11e2-0800-34a03cad54a7:678684 140117 11:56:05 [Note] WSREP: New cluster view: global state: 28e87291-da41-11e2-0800-34a03cad54a7:678691, view# 33: Primary, number of nodes: 3, my index: 1, protocol version 2 140117 11:56:05 [Warning] WSREP: Gap in state sequence. Need state transfer. 140117 11:56:07 [Note] WSREP: Running: 'wsrep_sst_xtrabackup --role 'joiner' --address '122.146.119.102' --auth 'username:password' --datadir '/var/lib/mysql/' --defaults-file '/etc/my.cnf' --parent '965'' WSREP_SST: [INFO] Streaming with tar (20140117 11:56:07.517) WSREP_SST: [INFO] Using socat as streamer (20140117 11:56:07.519) WSREP_SST: [INFO] Evaluating socat -u TCP-LISTEN:4444,reuseaddr stdio | tar xfi - --recursive-unlink -h; RC=( ${PIPESTATUS[@]} ) (20140117 11:56:07.531) 140117 11:56:07 [Note] WSREP: Prepared SST request: xtrabackup|122.146.119.102:4444/xtrabackup_sst 140117 11:56:07 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification. 140117 11:56:07 [Note] WSREP: Assign initial position for certification: 678691, protocol version: 2 140117 11:56:07 [Note] WSREP: Prepared IST receiver, listening at: tcp://122.146.119.102:4568 140117 11:56:07 [Note] WSREP: Node 1 (db_01) requested state transfer from '*any*'. Selected 0 (db_02)(SYNCED) as donor. 140117 11:56:07 [Note] WSREP: Shifting PRIMARY -> JOINER (TO: 678692) 140117 11:57:36 [Note] WSREP: Synchronized with group, ready for connections 140117 11:57:36 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification. 140117 11:57:36 [Note] WSREP: 1 (db_02): State transfer from 0 (db_01) complete. 140117 11:57:36 [Note] WSREP: Member 1 (db_02) synced with group.

          最後我們可以透過(guò) MySQL Status 來(lái)看看是否有建立成功

          mysql> show global status like 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name      | Value | +--------------------+-------+ | wsrep_cluster_size | 3     | +--------------------+-------+ 1 row in set (0.00 sec)

          看到 wsrep_cluster_size 出現(xiàn)正確的 Server 數(shù)量,就代表設(shè)定成功。

          設(shè)定 HAProxy 負(fù)載平衡

          上述完成了 3 臺(tái) Cluster 設(shè)定,接著所有的 Application 服務(wù)都需要直接跟此 Cluster 溝通,為了完成此需求,我們必須將 HAProxy 安裝在其中一臺(tái)伺服器來(lái)做負(fù)載平衡,今天會(huì)介紹兩種設(shè)定方式,第一種是採(cǎi)用 round robin 方式,意思就是說(shuō)所有的 Application 都可以連上並且寫入資料到三臺(tái)機(jī)器,這狀況其實(shí)沒有錯(cuò)誤,但是如果同時(shí)寫入三臺(tái)機(jī)器,難免會(huì)出現(xiàn) optimistic locking 而產(chǎn)生 rollback,如果可以確定不會(huì)產(chǎn)生 conflict,其實(shí)這方案是不錯(cuò)的。第2種設(shè)定方式就是只寫入單一 Node,但是可以讀取三臺(tái)機(jī)器,也就是 insert , update 都是在同一臺(tái) Node 完成,所以 Application 不用擔(dān)心會(huì)產(chǎn)生 rollback 情形。第1種設(shè)定在大部份的狀況底下都是可以運(yùn)作很好的,所以其實(shí)也不用擔(dān)心。

          底下是 /etc/haproxy/haproxy.cfg 設(shè)定

          frontend stats-front bind *:8080 mode http default_backend stats-back  frontend pxc-front bind *:3307 mode tcp default_backend pxc-back  frontend pxc-onenode-front bind *:3308 mode tcp default_backend pxc-onenode-back  backend stats-back mode http balance roundrobin stats uri /haproxy/stats stats auth username:password  backend pxc-back mode tcp balance leastconn option httpchk server c1 192.168.1.100:3306 check port 9200 inter 12000 rise 3 fall 3 server c2 192.168.1.101:3306 check port 9200 inter 12000 rise 3 fall 3 server c3 192.168.1.102:3306 check port 9200 inter 12000 rise 3 fall 3  backend pxc-onenode-back mode tcp balance leastconn option httpchk server c1 192.168.1.100:3306 check port 9200 inter 12000 rise 3 fall 3 server c2 192.168.1.101:3306 check port 9200 inter 12000 rise 3 fall 3 backup server c3 192.168.1.102:3306 check port 9200 inter 12000 rise 3 fall 3 backup

          從上述設(shè)定,可以看到我們定義了 3 個(gè) frontend-backend ,其中stats-front 是 HAProxy Status Page,另外兩組則是針對(duì) PXC 設(shè)定??吹酱嗽O(shè)定,可以知道系統(tǒng)會(huì) Listen 3307 及 3308 兩個(gè) port,其中 3308 會(huì)讓 App 使用一臺(tái) PXC Node 而已,此設(shè)定可以避免因?yàn)?nbsp;optimistic locking 而產(chǎn)生 rollbacks,如果 Node 掛點(diǎn),則會(huì)啟動(dòng)其他 Node。然而如果是連接 3307 port,系統(tǒng)會(huì)直接對(duì)3臺(tái) node 寫入或讀取,我們使用 leastconn 取代 round robin ,這代表著 HAProxy 會(huì)偵測(cè)所有機(jī)器,並且取得現(xiàn)在連線數(shù)目最少的 Node 來(lái)給下一個(gè)連線。最後stats-front 是顯示 HAProxy 偵測(cè)及連線狀態(tài),請(qǐng)務(wù)必設(shè)定帳號(hào)密碼。

          完成設(shè)定,如何偵測(cè) MySQL Server 是否存活,靠著就是 9200 port,透過(guò) Http check 方式,讓 HAProxy 知道 PXC 狀態(tài),安裝完 PXC 後,可以發(fā)現(xiàn)多了clustercheck 指令,我們必須先給 clustercheckuser 使用者帳號(hào)密碼

          # Grant privileges required: $ GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';

          此 clustercheck 指令會(huì)在 Local 執(zhí)行SHOW STATUS LIKE 'wsrep_local_state' MySQL 指令,回傳值為 200 或503 ,指令確定成功執(zhí)行,最後步驟就是透過(guò) xinetd 產(chǎn)生 9200 port 的服務(wù)。底下先安裝 xinetd 服務(wù)

          $ yum -y install xinetd

          產(chǎn)生 mysqlchk 設(shè)定

          # default: on # description: mysqlchk service mysqlchk { # this is a config for xinetd, place it in /etc/xinetd.d/     disable = no     flags = REUSE     socket_type = stream     port = 9200     wait = no     user = nobody     server = /usr/bin/clustercheck     log_on_failure += USERID     only_from = 0.0.0.0/0     # recommended to put the IPs that need     # to connect exclusively (security purposes)     per_source = UNLIMITED }

          上面步驟全部成功,請(qǐng)打開 URL 輸入 HAProxy Status 頁(yè)面,看到底下狀態(tài),就是代表設(shè)定成功

          Statistics Report for HAProxy

          posted @ 2014-10-16 14:17 小馬歌 閱讀(252) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題
          共95頁(yè): First 上一頁(yè) 16 17 18 19 20 21 22 23 24 下一頁(yè) Last 
           
          主站蜘蛛池模板: 安宁市| 襄汾县| 华宁县| 孝义市| 基隆市| 卓尼县| 烟台市| 日喀则市| 曲麻莱县| 靖安县| 恩施市| 永和县| 建瓯市| 高州市| 名山县| 隆子县| 安国市| 海伦市| 双鸭山市| 拉孜县| 达孜县| 广安市| 洛隆县| 淮南市| 柳林县| 迁安市| 郁南县| 腾冲县| 藁城市| 广汉市| 交口县| 随州市| 葫芦岛市| 察雅县| 靖江市| 禄劝| 衡东县| 鄂温| 永康市| 大渡口区| 闻喜县|