<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


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

    Maven面臨的挑戰

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

    Gradle初體驗

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

    類似于Maven的pom.xml文件,每個Gradle項目都需要有一個對應的build.gradle文件,該文件定義一些任務(task)來完成構建工作,當然,每個任務是可配置的,任務之間也可以依賴,用戶亦能配置缺省任務,就像這樣:

    復制代碼
    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
    復制代碼

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

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

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

    依賴管理和集成Maven倉庫

    我們知道依賴管理、倉庫、約定優于配置等概念是Maven的核心內容,拋開其實現是否最優不談,概念本身沒什么問題,并且已經被廣泛學習和接受。那Gradle實現了這些優秀概念了么?答案是肯定的。

    先看依賴管理,我有一個簡單的項目依賴于一些第三方類庫包括SpringFramework、JUnit、Kaptcha等等。原來的Maven POM配置大概是這樣的(篇幅關系,省略了部分父POM配置):

    復制代碼
       <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>
    復制代碼

    然后我將其轉換成Gradle腳本,結果是驚人的:

    復制代碼
    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') }
    復制代碼

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

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

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

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

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

    Gradle項目使用Maven項目生成的資源已經不是個問題了,接著需要反過來考慮,Maven用戶是否能夠使用 Gradle生成的資源呢?或者更簡單點問,Gradle項目生成的構件是否可以發布到Maven倉庫中供人使用呢?這一點非常重要,因為如果做不到這一 點,你可能就會丟失大量的用戶。幸運的是Gradle再次給出了令人滿意的答案。使用Gradle的Maven Plugin,用戶就可以輕松地將項目構件上傳到Maven倉庫中:

    復制代碼
    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"         }     } }
    復制代碼

    在上傳的過程中,Gradle能夠基于build.gradle生成對應的Maven POM文件,用戶可以自行配置POM信息,比如這里的groupId和artifactId,而諸如依賴配置這樣的內容,Gradle是會自動幫你進行轉 換的。由于Maven項目之間依賴交互的直接途徑就是倉庫,而Gradle既能夠使用Maven倉庫,也能以Maven的格式將自己的內容發布到倉庫中, 因此從技術角度來說,即使在一個基于Maven的大環境中,局部使用Gradle也幾乎不會是一個問題。

    約定優于配置

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

    • src/main/java

    • src/main/resources

    • src/test/java

    • src/test/resources

    區別在于,使用Groovy自定義項目布局更加的方便:

    復制代碼
    sourceSets {     main {         java {             srcDir 'src/java'         }         resources {             srcDir 'src/resources'         }     } }
    復制代碼

    Gradle Java Plugin也定義了構建生命周期,包括編譯主代碼、處理資源、編譯測試代碼、執行測試、上傳歸檔等等任務:

    Figure 1. Gradle的構建生命周期

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

    build.dependsOn 'uploadArchives'

    小結

    一番體驗下來,Gradle給我最大的感覺是兩點。其一是簡潔,基于Groovy的緊湊腳本實在讓人愛不釋手,在表述意圖方面也沒有什么不清晰的地 方。其二是靈活,各種在Maven中難以下手的事情,在Gradle就是小菜一碟,比如修改現有的構建生命周期,幾行配置就完成了,同樣的事情,在 Maven中你必須編寫一個插件,那對于一個剛入門的用戶來說,沒個一兩天幾乎是不可能完成的任務。

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

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

    關于作者

    許曉斌(Juven Xu),國內社區公認的Maven技術專家、Maven中文用戶組創始人、Maven技術的先驅和積極推動者,著有《Maven實戰》一 書。對Maven有深刻的認識,實戰經驗豐富,不僅撰寫了大量關于Maven的技術文章,而且還翻譯了開源書籍《Maven權威指南》,對Maven技術 在國內的普及和發展做出了很大的貢獻。就職于Maven之父的公司,負責維護Maven中央倉庫,是Maven倉庫管理器Nexus(著名開源軟件)的核 心開發者之一,曾多次受邀到淘寶等大型企業開展Maven方面的培訓。此外,他還是開源技術的積極倡導者和推動者,擅長Java開發和敏捷開發實踐。他的 個人網站是:http://www.juvenxu.com

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

    2、Gradle編譯Maven風格的java項目 
        首先,在項目根目錄創建"build.gradle"文件,編譯java項目需要使用gradle的java插件
    Groovy代碼  收藏代碼
    1. apply plugin: 'java'  
    ,因為要集成maven的功能,需要添加maven插件
    Groovy代碼  收藏代碼
    1. apply plugin: 'maven'[   
    。 
        接著,配置項目的Repository,風格如下
    Groovy代碼  收藏代碼
    1. repositories{  
    2.          mavenCentral();  
    3.     }  
    ,上面例子使用的是默認的maven的中央庫,如果想用自己的本地庫,可通過如下方式配置
    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. }  


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


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

    MavenVsGradle

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

    本文比較了兩個構建工具:Maven和Gradle,并討論了各自的優點和缺點。

    Maven簡介

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

    Gradle簡介

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

    比較

     

    Maven使用XML來定義生成腳本。和Ant一樣,這是一個安全的選擇,因為大多數人都熟悉XML配置。 Gradle構建腳本是用Groovy寫的。 用XML優勢在于它可以更方便地定義構建邏輯是比較復雜的步驟不僅僅是不變的一系列。 用Groovy的好處就是寫起來比XML標簽簡潔得多。 Groovy的毛病就是熟悉的XML的開發人員比groovy的多,這些爺們必需自己來寫復雜的邏輯。

    性能

     

    一些 非正式的測試 表明Gradle 比Maven性能高不了,甚至還低一點。 讓人抓狂的是這倆兄弟都似乎要明顯慢于Ant。 使用Maven構建JBoss應用服務器比用Ant構建要多兩倍的時間。

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

    譯者注:使用Gradle,在一個task里寫了個循環 調用flex的mxmlc,才編譯3個mxml文件,丫的就出現了Java heap space錯誤了。情何以堪啊

     

    依賴配置

     

    通常的Maven項目有一個單一的依賴的靜態配置, 所以一個項目應該有只有一個單一的Artifact。 簡單就是他的優勢,但也缺乏彈性。 Gradle在這方面的更靈活。 可以在創建和處理的時候有多套依賴配置。 

    (Gradle因為簡單性和靈活性獲勝,Maven和 Ant/Ivy次之)

     

    使用Artifact倉庫

     

    Maven有自己的單一倉庫格式。 Gradle可以使用Ivy倉庫和Maven倉庫。 部署到Maven倉庫是非常容易,Ant和Gradle就需要你多動動腦經了。

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

     

    加載構建系統的組件

     

    Maven采取的做法是每個用于構建的組件(編譯/jar等​​)都作為一個插件。 每個插件都有它自己的版本和依賴關系樹。 Gradle的構建系統組件都是分散的。 Maven插件的優點是在于可以獨立更新,無需整個系統更新。Gradle的模型的優點是,編譯需要核心組件以外的組件時才下載。

     

    Maven和Gradle在這點上都比Ant好。 Ant需要Ivy和一些麻煩的配置來實現。

    (Maven和Gradle并列,Ant第二因為它需要更多的設置來加載額外的構建組件)

    譯者注:少造輪子

     

    構建生命周期

    Maven提供有限的構建生命周期訪問。 插件可以連接到生命周期的特定階段,而且只有在核心插件執行。 Gradle很容易這方面NB,因為它可以輕松地訪問任何生成的一部分,并允許用Groovy代碼處理。Ant也可以訪問任何一部分構建,但是需要用任務來實現而不是代碼,所以還是不如Gradle強大。

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

     

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

    介紹

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

    都能干啥

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

    框架結構

    本插件框架由三個包組成:

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

    如何使用

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

    這是微信的插件瀏覽頁面,所有可暴露在這里的插件都會被列出來

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

    主程序(APK)

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

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

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

    • 、引入本框架的jar包或導入源碼

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

    這樣就把所有插件找到手了,很簡單吧?

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

    插件程序(APK)

    • 、插件程序清單

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

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


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

            <!-- 描述類,這個是自定義的 -->
            <!-- 這個描述類使用戶定義的,在主程序中必須有,插件工程中也必須有,并被繼承 -->
            <description name="org.pakage.name.and.description.name"/>
           
            <!-- 這是一個功能(類),必須是activity的子類 -->
            <feature name="org.pakage.name.and.activity.name1">
           
                    <!-- 這是一個方法 -->
                    <!-- 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>
    按著上面的套路來配置,就很容易了。

    最后

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

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

    破解方法:

    步驟1:首先我們需要CloneCD這個軟件,下載地址:天極網下載頻道。注意不能使用NERO等其他光驅軟件,因為NERO讀不過壞道,可能造成死機的情況。

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

    CloneCD將讀取的整個光盤內容制作成鏡像文件,中途在記錄框中出現讀取扇區失敗的信息,同時光驅中會出現咔咔咔咔的響聲音,這個是正常現象。cloneCD能制作鏡像的原理就是能真實地按照1∶1 全盤復制CD,不管是否有保護或加密之類,它都會跳過人為設置的壞道把有用部分鏡像制作出來。

    跳過壞道大概用時兩三分鐘,視你的光驅讀盤能力而定,在顯示跳過偽扇區后經過十多分鐘就可以把這個光盤制作成鏡像文件,最后顯示讀取完成后在目錄下會出現image.img等四個文件。

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

    • 標簽: android Android andriod 開源項目
    posted @ 2014-10-22 19:56 小馬歌 閱讀(211) | 評論 (0)編輯 收藏
     
         摘要: from:https://typeblog.net/tech/2014/07/22/use-buck-to-build-your-app.htmlbuck 是Facebook推出的一款高效率的Android App/Java項目構建工具,目前僅支持 Unix/Linux 平臺。因為它使用多線程編譯方式,所以相對于其他的構建工具而言編譯時間可以縮短50%甚至更多。buc...  閱讀全文
    posted @ 2014-10-22 19:34 小馬歌 閱讀(3691) | 評論 (0)編輯 收藏
     
         摘要: from:http://blog.csdn.net/signmem/article/details/17379427特色MySQL/Galera 是一種多主同步集群,但只限于使用 MySQL/InnoDB 引擎,并具有下面特點同步復制多個主服務器的拓撲結構可以在任意節點上進行讀寫自動控制成員,自動刪除故障節點自動加入節點真正給予行級別的并發復制調度客戶連接優勢參考下面基于 DBMS 集群的解決方法...  閱讀全文
    posted @ 2014-10-16 14:18 小馬歌 閱讀(350) | 評論 (0)編輯 收藏
     

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

    標簽: InnoDB MySQL Percona XtraDB Cluster Percoba XtraDB ClusterPercona Software | 發表時間:2014-01-19 13:02 | 作者:appleboy

    percona

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

    安裝 Percona XtraDB Cluster

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

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

    如果系統已經有安裝過 MariaDB + Galera ,請務必先移除套件

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

    [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 臺或第 3 臺 PXC 服務的時候,務必確認第 1 臺已經正確開啟成功。上面設定檔是針對第 1 臺做設定,之後新增 Node,請務必修改wsrep_cluster_address 填上你想要 Join 的 Cluster Server IP Address,另外每臺的 server_id 及 wsrep_node_name 也會不同,請務必注意

    第 2 臺設定值

    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 臺設定值

    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

    根據 State Snapshot Transfer (簡稱 SST),我們使用 Xtrabackup ,當新的 Node 連上時,就會開始複製資料到新的 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.

    最後我們可以透過 MySQL Status 來看看是否有建立成功

    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 出現正確的 Server 數量,就代表設定成功。

    設定 HAProxy 負載平衡

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

    底下是 /etc/haproxy/haproxy.cfg 設定

    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

    從上述設定,可以看到我們定義了 3 個 frontend-backend ,其中stats-front 是 HAProxy Status Page,另外兩組則是針對 PXC 設定。看到此設定,可以知道系統會 Listen 3307 及 3308 兩個 port,其中 3308 會讓 App 使用一臺 PXC Node 而已,此設定可以避免因為 optimistic locking 而產生 rollbacks,如果 Node 掛點,則會啟動其他 Node。然而如果是連接 3307 port,系統會直接對3臺 node 寫入或讀取,我們使用 leastconn 取代 round robin ,這代表著 HAProxy 會偵測所有機器,並且取得現在連線數目最少的 Node 來給下一個連線。最後stats-front 是顯示 HAProxy 偵測及連線狀態,請務必設定帳號密碼。

    完成設定,如何偵測 MySQL Server 是否存活,靠著就是 9200 port,透過 Http check 方式,讓 HAProxy 知道 PXC 狀態,安裝完 PXC 後,可以發現多了clustercheck 指令,我們必須先給 clustercheckuser 使用者帳號密碼

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

    此 clustercheck 指令會在 Local 執行SHOW STATUS LIKE 'wsrep_local_state' MySQL 指令,回傳值為 200 或503 ,指令確定成功執行,最後步驟就是透過 xinetd 產生 9200 port 的服務。底下先安裝 xinetd 服務

    $ yum -y install xinetd

    產生 mysqlchk 設定

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

    上面步驟全部成功,請打開 URL 輸入 HAProxy Status 頁面,看到底下狀態,就是代表設定成功

    Statistics Report for HAProxy

    posted @ 2014-10-16 14:17 小馬歌 閱讀(252) | 評論 (0)編輯 收藏
    僅列出標題
    共95頁: First 上一頁 16 17 18 19 20 21 22 23 24 下一頁 Last 
     
    主站蜘蛛池模板: 亚洲一级特黄大片无码毛片 | 黄床大片免费30分钟国产精品| 亚洲午夜福利精品久久| 在线观看特色大片免费网站 | 最近国语视频在线观看免费播放| 久久精品亚洲精品国产色婷| 国产成人免费网站在线观看| 国产猛男猛女超爽免费视频| 亚洲人成77777在线观看网| ZZIJZZIJ亚洲日本少妇JIZJIZ| 曰批全过程免费视频网址| 老子影院午夜伦不卡亚洲| 亚洲精品自产拍在线观看动漫| 暖暖日本免费在线视频 | 亚洲高清免费视频| 国产成人精品免费视频动漫 | 日本一区二区三区日本免费| 久久国产乱子精品免费女| 亚洲人成自拍网站在线观看| 亚洲av综合av一区| 免费播放春色aⅴ视频| 4399好看日本在线电影免费| AAAAA级少妇高潮大片免费看| 亚洲色欲啪啪久久WWW综合网| 国产亚洲精品岁国产微拍精品| 狼友av永久网站免费观看| 91精品免费不卡在线观看| 免费人成视频在线播放| 亚洲久悠悠色悠在线播放| 亚洲第一AV网站| 亚洲?v无码国产在丝袜线观看| 免费国产成人高清在线观看网站| A片在线免费观看| 四虎影视永久在线精品免费| 天堂亚洲国产中文在线| 亚洲日本乱码一区二区在线二产线 | 最近中文字幕无免费视频| 日韩精品极品视频在线观看免费| 国产精品免费观看视频| 特级aaaaaaaaa毛片免费视频| 亚洲熟妇AV一区二区三区宅男|