Manually adding aar with dependency pom/iml file

后端 未结 2 1976
悲哀的现实
悲哀的现实 2020-12-02 09:48

Since I cannot use a private maven in order to share my library, I was thinking in sharing the aar and importing into another project. The problem comes when the aar and ja

相关标签:
2条回答
  • 2020-12-02 09:58

    1. Publishing

    In your aar project, add maven-publish plugin and add necessary plugin configuration.

    apply plugin: 'com.android.library'
    apply plugin: 'maven-publish'
    
    ...
    
    dependencies {
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.novoda:bintray-release:0.2.7'
    }
        
    ...
    
    publishing {
        publications {
            maven(MavenPublication) {
                groupId 'com.example' //You can either define these here or get them from project conf elsewhere
                artifactId 'example'
                version '0.0.1-SNAPSHOT'
                artifact "$buildDir/outputs/aar/app-release.aar" //aar artifact you want to publish
    
                //generate pom nodes for dependencies
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')
                    configurations.compile.allDependencies.each { dependency ->
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dependency.group)
                        dependencyNode.appendNode('artifactId', dependency.name)
                        dependencyNode.appendNode('version', dependency.version)
                    }
                }
            }
        }
        
        //publish to filesystem repo
        repositories{
            maven {
                url "$buildDir/repo"
            }
        }
    }
    

    Few things to note:

    1. We're using a custom maven publication, so you have to define what is being published with the artifact clause

    2. We have to generate the pom ourselves, in the code above I'm using all compile config dependencies, you may want to make sure all the configs you care about are covered.

    Running gradle publish will publish to a maven repo structure to the repo folder, which you can then consume from a different project.

    2. Using published .aar

    In a different android project, to use the aar published in #1: In top level build.gradle:

    allprojects {
        repositories {
            jcenter()
            maven {
                url "D:/full/path/to/repo"
            }
        }
    }
    

    add the path to earlier repo as a maven repository. Note that you may have to use the full path, because $buildDir has a different value for this project. In your app build.gradle:

    dependencies {
        ...
        other dependencies
        ...
        implementation ('com.example:example:0.0.1-SNAPSHOT@aar'){transitive=true}
    }
    

    transitive=true is required for to fetch the transitive dependencies from the pom file.

    0 讨论(0)
  • 2020-12-02 10:06

    Things have changed a little, here's how you do it with the latest versions of gradle

    Create the package localy (aar and pom)

    Modify your library build.gradle file to include

    apply plugin: 'maven-publish'
    
    android {
        ...
        ...
    }
    
    dependencies {
        ...
        ...
    }
    
    publishing {
        publications {
            maven(MavenPublication) {
                groupId 'com.domain' //You can either define these here or get them from project conf elsewhere
                artifactId 'name'
                version '1.0.0'
                artifact "$buildDir/outputs/aar/sdk-release.aar" //aar artifact you want to publish
    
                //generate pom nodes for dependencies
                pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.each { dependency ->
                    if (dependency.name != 'unspecified') {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dependency.group)
                        dependencyNode.appendNode('artifactId', dependency.name)
                        dependencyNode.appendNode('version', dependency.version)
                    }
                }
            }
        }
    
        //publish to filesystem repo
        repositories{
            maven {
                url "$buildDir/repo"
            }
        }
    }
    

    Run from terminal

    ./gradlew clean
    ./gradlew build
    ./gradlew --console=verbose publishToMavenLocal
    

    The aar and pom files have been created at $HOME/.m2/repository/

    How to load the library from a different project

    Modify the projects's build.gradle in the following way:

    allprojects {
        repositories {
            maven {
                url "/Users/username/.m2/repository/"
            }
            google()
            jcenter()
        }
    

    You can use $rootDir and set a relative path.

    Add the library as a dependency in your app module build.gradle

    implementation 'com.domain:name:1.0.0'

    0 讨论(0)
提交回复
热议问题