web-dev-qa-db-ja.com

依存関係のあるpom / imlファイルを含むaarを手動で追加する

ライブラリを共有するためにプライベートmavenを使用することはできないので、aarを共有して別のプロジェクトにインポートすることを考えていました。この問題は、aarファイルとjarファイルに依存関係が含まれていない場合に発生します。したがって、Android studio(Import .JAR/.AA Packageを使用)でaarを手動でインポートすると、依存関係はなくなり、すべての依存関係を手動で再度追加する必要があります。pomファイルはすでに生成されていますプロジェクトに手動でインポートする方法はありませんが、gradleタスクを使用します。

「.JAR/.AAパッケージのインポート」によって自動的に生成されたbuild.gradleファイルは次のとおりです。

configurations.maybeCreate("default")
artifacts.add("default", file('TestSample_1.0.0.aar'))

Pom/imlファイルも追加する方法はありますか?何かのようなもの:

artifacts.add("default", file('pomDependencies.xml'))
25
iGoDa

1.出版

Aarプロジェクトで、maven-publishプラグインを追加し、必要なプラグイン構成を追加します。

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

注意すべきいくつかのこと:

  1. 私たちはカスタムのMavenパブリケーションを使用しているので、artifact句でパブリッシュされるものを定義する必要があります

  2. 自分でpomを生成する必要があります。上のコードでは、すべてのコンパイル構成の依存関係を使用しています。必要な構成がすべてカバーされていることを確認したい場合があります。

gradle publishを実行すると、Mavenレポ構造からrepoフォルダーにパブリッシュされ、別のプロジェクトから使用できます。

2.公開された.aarを使用する

別のAndroid=プロジェクトで、#1で公開されたaarを使用するには:トップレベルのbuild.gradleで:

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

以前のリポジトリへのパスをMavenリポジトリとして追加します。このプロジェクトでは$buildDirの値が異なるため、完全パスを使用する必要がある場合があることに注意してください。アプリのbuild.gradleで:

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

transitive=trueは、pomファイルから推移的な依存関係を取得するために必要です。

38
RaGe

物事は少し変更されました。最新バージョンのgradleを使用してこれを行う方法を次に示します

パッケージのローカルを作成(aarおよびpom)

ライブラリbuild.gradleファイルを変更して、

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

ターミナルから実行

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

aarおよびpomファイルが$HOME/.m2/repository/に作成されました

別のプロジェクトからライブラリをロードする方法

プロジェクトのbuild.gradleを次のように変更します。

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

$rootDirを使用して、相対パスを設定できます。

ライブラリを依存関係としてアプリモジュールに追加しますbuild.gradle

implementation 'com.domain:name:1.0.0'

0
aviran