Android使用gradle的管理本地Maven服務器

1 環境說明

操作系統 Ubuntu 14.04(x64)
maven   maven3.3.9
jdk     jdk-1.8.0_65
nexus   nexus2.11.4
gradle  gradle2.9

2安裝

分別解壓縮,然後添加進PATH環境變量。

3使用

  1. 使用maven

    $M2_HOME/conf/settings.xml:    Maven全局配置
    ${USER_HOME}/.m2/settings.xml: 用戶的全局配置(優先)
    
    <repositories>
        <repository>
            <id>central</id>
            <name>Central Repository</name>
            <url>http://repo.maven.apache.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    
    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Central Repository</name>
            <url>http://repo.maven.apache.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>
    </pluginRepositories>
    
    其參數:localRepository 本地repository路徑
            interactiveMode:是否需要和用戶交互以獲得輸入,true:需要
            usePlugRegistry:是否需要plugin-registry.xml文件來管理插件版本。
            offline 是否需要在離線模式下運行-->不能連接網絡服務器時,有用
            proxy   代理相關設置
            server  服務器相關設置
            mirrors 爲倉庫列表配置的下載鏡像列表
            repositories    遠程倉庫列表,是maven用來填充構建系統本地倉庫所使用的一組遠程項目
  2. 使用nexus

    nexus start     啓動服務
    nexus stop  停止服務

    服務啓動後,訪問地址爲:http://localhost:8081/nexus,系統管理員爲admin/admin123

  3. 配置倉庫
    nexus裏面可以配置的倉庫有三種:

    proxy   遠程倉庫的代理,當用戶向這個proxy請求一個artifact,proxy首先會再本地找,
            找不到再從遠程服務器下載,然後返回
    hosted  宿主倉庫,用戶可以把自己的一些構件,deploy到hosted中
    group   倉庫組,nexus的概念,多倉庫聚合。

    配置Central,修改Download Remote Index 爲true。
    配置Hosted Repository,Deployment Policy選項,Snapshots會配置成allow,其他的設置爲disable。

    3rd party   用以保存第三方jar
    Snapshpts   用以項目組內部的快照
    Release 用以項目內部的發佈版
    

    group是一個虛擬的倉庫,通過對實體倉庫(proxy.hosted)進行聚合,對外暴漏統一地址。

  4. maven client端配置
    配置了一個server,其中增加了權限相關信息,

    <?xml version="1.0" encoding="UTF-8"?>
    
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://  maven.apache.org/xsd/settings-1.0.0.xsd">
        <servers>
            <server>
                <id>nexus-snapshots</id>
                <username>admin</username>
                <password>admin123</password>
            <server>
        <servers>
    
        <mirrors>
            <mirror>
                <id>nexus</id>
                <name>internal nexus repository</name>
                <url>http://192.168.3.5:8081/nexus/content/groups/public/</url>
                <mirrorOf>central</mirrorOf><!--這裏只鏡像central,可以改爲*,匹配全部-->
            </mirror>
        </mirrors>
    <settings>

以上是直接使用maven的方式配置,對於Android而言,可以直接使用gradle託管,方便很多,具體如下:

  1. Gradle配置
    方式一:每個項目更改,build.gradle文件

    allprojects {
        repositories {
            maven{
            credentials{
                username    'admin'
                password    'admin123'
            }
            url 'http://192.168.3.5:8081/nexus/content/groups/public/'
            }
            //jcenter()
            //mavenLocal()
        }
    }

    方式二:在USER_HOME/.gradle/目錄下添加init.gradle文件,內容如下:

    allprojects{
    repositories {
        def REPOSITORY_URL = 'http://192.168.3.5:8081/nexus/content/groups/public/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                    remove repo
                    }
                }
            }
            maven {
                url REPOSITORY_URL
            }
        }
    }

    init.gradle是Gradle的初始化腳本,也是運行時全局配置。

  2. 發佈到maven

    修改build.gradle,添加

    apply   plugin:'maven'
    uploadArchives{
        repositories{
            mavenDeployer{
            pom.groupId = "com.felix.test"
            pom.version = "1.0.0"
    
            repository(url: "http://192.168.3.5:8081/nexus/content/groups/public/")
            {
            authentication(userName: admin, password: admin123) 
            }
            }
        }
    }

    然後執行 gradle uploadArchives 上傳到本地庫。

  3. gradle淺析

    project 指一個項目
    task 構建過程中的任務
    build.gradle 配置文件,負責構建的定義。每個module對應一個gradle文件

  4. project層的build.gradle分析

    buildscript {
        repositories {  //構建過程中依賴的倉庫,這裏是指gradle腳本需要的資源位置。
            jcenter()   
        }
        dependencies {  //構建過程中依賴的庫
            classpath 'com.android.tools.build:gradle:1.5.0'  //申明gradle的版本
        }
    }
    allprojects {   //這裏配置當前project中每個module公有的依賴倉庫,這樣每個module不用單獨配置。這裏是項目需要的倉庫資源位置。
        repositories {
            jcenter()
        }
    }
  5. 某個module中的build.gradle

    apply plugin: 'com.android.application'  //申明爲Android APP
    
    android {//android構建時需要的參數配置
        compileSdkVersion 23    //sdk版本
        buildToolsVersion "23.0.1"  //buildtool版本,以上兩個版本,都需要你sdk中相應內容已經安裝。否則會報錯。(當然也可以改成你已經安裝的版本)
    
        defaultConfig { //默認配置,會同時應用到debug和release版本
            applicationId "com.felix.testweatherfish"  //app包名,apply plugin中指定當前是com.android.application,才能包含此項。
            minSdkVersion 15    //最低支持的SDK版本
            targetSdkVersion 23 //目標(編譯)SDK版本
            versionCode 1       //app版本
            versionName "1.0"   //app 版本號
            multiDexEnabled true    //支持多dex,具體見後續分析
        }
    
        sourceSets {    //目錄映射關係說明
            main {  //系統默認的source set
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
    
            compile
            }
            api{
                //這裏若是不設置 java.srcDirs 則默認使用${path-to-project}/src/api/java目錄。
                //這裏若是不設置 res.srcDirs 則默認使用${path-to-project}/src/api/resources目錄。
                //當然也可以使用類似main中自定義目錄。
                //編譯的時候使用gradle apiClasses 
    
    
            }
        }
    
        repositories{//編譯本地aar依賴,最終需要在dependencies中添加引用
            flatDir{
                dir 'aarlib'    //aar依賴文件所在目錄
            }
        }
    
        signingConfigs {    //簽名配置
            HetConfig { //簽名配置標籤,可以有多個
            //建議密碼不要明文寫這裏,寫在gradle.properties中,再通過storeFile引用
            storeFile file("Het_KeyStore") //簽名文件
            storePassword "szhittech"   //簽名密碼
            keyAlias "Clife"            //應用別名
            keyPassword "szhittechclife"  //應用別名密碼
            }
        }
    
        lintOptions {   //移除lint檢查的error
            abortOnError false
        }
    
        compileOptions{ //編譯選項,以下指定了Java版本
            sourceCompatibility javaVersion.VERSION_1_7
            targetCompatibility javaVersion.VERSION_1_7
        }
    
        buildTypes {    //這裏可以配置debug和release版本的一些參數,比如混淆,簽名等
            release {   //指定release版本編譯的特殊參數
                minifyEnabled false //是否混淆,混淆的時候會去掉一些無用的方法等
                shrinkResources true    //壓縮資源,會去掉無用的資源文件
                //混淆使用的文件,前面部分是系統默認的Android混淆文件,
                //此文件位於sdk目錄/tools/proguard/proguard-android.txt. 
                //後面試項目中自定義的混淆文件,兩部分一起配合使用來混淆工程。
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
            signingConfig  signingConfigs.HetConfig //使用上面定義的簽名配置文件
            }
            debug{
            //debug版本一般使用默認簽名就可以
            //默認簽名文件位於${home}/.android/debug.keystore
            //默認簽名的引用方法 signingConfig  android.signingConfig.debug
            }
        }
    }
    
    task HelloWorld <<{ //定義一個任務,具體分析見下面
        println "Hello World!"
    }
    
    task copyFile(type: Copy){  //自定義任務,將xml文件夾下的所有內容拷貝到destination。這兩個目錄都是build.gradle所在目錄下的目錄。
        from 'xml'
        into 'destination'
        description "test"  //描述信息
    }
    
    task taskA(dependsOn: copyFile){    
        //taskA依賴於copyFile這個task,
        //即在執行gradle taskA的時候,會先執行 gradle copyFile
    
        def source = fileTree('srcDirs')    //文件夾和文件位置定義
        def destination = file('destination.txt')
    
        //設置任務的輸入輸出路徑,以實現增量編譯
        inputs.dir source
        outputs.file destination
    
        doLast{
            destination.withPrintWriter {writer ->
                sources.each {source ->
                writer.println source.text
                }
            }
        }
    }
    
    dependencies {  //當前模塊的依賴
        compile fileTree(dir: 'libs', include: ['*.jar']) //編譯lib目錄裏面的所有*.jar文件
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.1.1'
        provided 'com.android.support:design:23.1.1' //編譯時依賴,但不包含
        compile project(':test:SimpleAndroid') //編譯test目錄下的SimpleAndroid
        compile 'com.android.common:baseprj:23.1.1@aar' //編譯依賴第三方的aar文件
        compile (name:'xxx', ext:'aar')編譯本地aar依賴文件
        compile (group:'xxxx', name: 'xxxx', version: 'xxxx'){
            exclude group:'xxx', module:'xxx'  //排除依賴,解決依賴衝突,module對應的就是artifactId。
        }
        compile 'com.android.support:multidex:1.0.0' //支持多dex,具體見後續分析
    }

    解析說明:

    apply plugin: '' 申明.

    com.android.application 申明爲Android APP
    com.android.library     申明爲Android Library
    maven   使用maven作爲jar/aar包的依賴管理,通過maven倉庫下載項目依賴
    war     指定web項目編譯(build)生成war包
    java    指定項目爲Java項目,項目編譯時生成jar包 
    jetty   加入jetty支持,代碼修改後直接 gradle jettyRun即可運行項目
    可以添加自定義插件
    

    defaultConfig中涉及到除了上面例子中內容外,還有

    siginingConfig/proguardFiles等       
    

    支持MultiDex
    首先在defaultConfig中,設置multiDexEnabled true
    然後,在dependencies中添加依賴compile 'com.android.support:multidex:1.0.0'
    最後,在application中,複寫attachBaseContext方法

    ```
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
    ```
    MultiDex這部分內容加載是在靜態方法之後,故若application中如果有靜態方法,不要引用非第一個dex文件中的方法。而且編譯的buildtool必須是21以上。
    

    自定義任務task說明

    可以通過gradle tasks 方法查詢當前定義的所有task
    gradle properties   查看project中定義的property
    gradle dependencies 查看當前project的依賴關係
    <<  表示向HelloWorld中加入執行代碼(groovy代碼)
    
  6. wrapper目錄下的gradle-wrapper.properites文件

    該文件申明瞭gradle目錄與下載路徑以及當前項目使用的gradle版本。

  7. setting.gradle

    include ':app',':test:SimpleAndroid'

    主要用於申明需要加入gradle的module。

  8. gradle任務

    assemble 構建項目輸出
    check 運行檢測和測試任務
    build 運行assemble和check
    clean 清理輸出任務

  9. 關於gradle更多資料,可以參考這篇博客

  10. 使用SNAPSHOT
    發佈SNAPSHOT版本的時候REPO_RELEASE = ‘false’ 否則REPO_RELEASE =’true’.

uploadArchives{
        repositories{
            def REPO_RELEASE = 'false'
            if(REPO_RELEASE == 'true'){
                mavenDeployer{
                pom.groupId = "com.felix.test"
                pom.version = "1.0.0"

                repository(url: "http://192.168.3.5:8081/nexus/content/groups/public/")
                {
                authentication(userName: admin, password: admin123) 
                }
            }else{
            mavenDeployer{
                pom.groupId = "com.felix.test"
                pom.version = "1.0.0-≈"

                snapshotRepository(url: "http://192.168.3.5:8081/nexus/content/groups/public/")
                {
                authentication(userName: admin, password: admin123) 
                }
            }
        }
    }
  1. 解決gradle配置完成後,REPO_RELEASE無法自動獲取最新版本
compile group:"com.android.common",name:"BaseProject",version:"1.0.0-SNAPSHOT",changing:"true"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章