1. 程式人生 > >建立和生成本地或遠端Maven倉庫

建立和生成本地或遠端Maven倉庫

在我們用普通方法對Libray Module進行打包為 test.jar,然後放到libs中使用的過程中,如果Library Module有遠端依賴時,我們在使用test.jar的時候就會出現 ClassNotFoundException。因為遠端依賴並沒有被打包到test.jar中。

為什麼一定要通過釋出Maven庫才能訪問Library Module的遠端依賴

  • 首先,我們需要了解打包過程。當我們需要對一個Library Module進行打包的時候,Library專案的遠端依賴不會被一起打包到aar或jar檔案中。因為打包的過程其實就是對編譯出來的class二進位制檔案進行壓縮打包而已,而編譯過程下載到本地的遠端依賴包一般是在 Users/username/.gradle/cache/modules-2/files-2.1
    目錄下,並不是直接下載到當前工程的目錄下的,所以並不會被打包的。
  • 然後,我們要知道maven倉庫有什麼特別的,可以讓我們通過compile的設定就能知道已經打包的aar或者jar需要哪些遠端依賴。一個maven目錄如下
    這裡寫圖片描述
    其中,所有Library Module的遠端依賴都在.pom檔案中,而在主專案就是通過.pom檔案來下載這些遠端依賴的。
  • 結論 : 所以,要想打包的 Library Module 可以包含依賴,就要把這個 Library Module 釋出成一個Maven倉庫。通過像其他遠端第三庫一樣,在 app/build.gradle 中配置 compile ‘groupId:articleId:version’ 來使用。

注 : 關於如何檢視下的jar和aar檔案位置可以在 app/build.gradle 配置指令碼程式碼如下:

task showMeCache << {
     configurations.compile.each { println it }
 }

釋出Maven倉庫

釋出/使用本地Maven倉庫

  1. 在 Library_Directory/build.gralde 中加入如下程式碼,確保 ANDROID_HOME已經配置:

Note :
* version 是 Library 版本
* groupId 是 Library 包名
* artifactId 是 Library 名稱

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/" + System.getenv("ANDROID_HOME")
                    + "/extras/android/m2repository/")
            pom.version = '1.0-SNAPSHOT'
            pom.groupId = 'your.package'
            pom.artifactId = 'sdk-name'
        }
    }
}
  1. 完成後,會在如上指定目錄URL(/extras/Android/m2repository/…) 中生成相應目錄作為本地Maven倉庫。

3.因為是在自定義目錄下生成的本地Maven倉庫,專案預設的 mavenLocal 一般是在 /Users/username/.m2/repository 下面,所以需要對專案需要Maven倉庫進行配置。

程式碼配置:

android/build.gradle

allprojects {
    repositories {
        mavenLocal()
        jcenter()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        maven {
            url "file:///C:/Users/username/AndroidHomePath/extras/android/m2repository"
        }
    }
}
  1. 配置好了專案Maven倉庫的來源,配置上對這個Maven倉庫中那個生成的庫的依賴就ok了

android/app/build.gradle

dependencies {
    ...
    compile 'groupId:articleId:version'
    ...
}

最後,嘗試build後,看看Library Module的遠端依賴有沒有下載到本地就ok

釋出/使用遠端Maven倉庫

對於釋出遠端maven倉庫,就有很多選擇,可以釋出到自己的區域網伺服器,中央倉庫和Jboss倉庫。而釋出到私服可以直接選擇釋出到git上去管理。
對於遠端倉庫的釋出程式碼如下:

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://xxx/xxx")
            pom.version = '1.0-SNAPSHOT'
            pom.groupId = 'your.package'
            pom.artifactId = 'sdk-name'
        }
    }
}

使用的時候只需要將 android/build.gradle 中 maven 的 url 改成伺服器地址就ok。