Gradleを使用してaarライブラリの一時的な依存関係が解決されない


93

私はしばらく調査しましたが、おそらくaarおよび推移的依存関係に関連する最も一般的な回答をここで見ましたが、どういうわけかこれを機能させる方法はまだはっきりしていません。

そう:

私は与えられたgradle設定を持つandroidライブラリを持っています:

apply plugin: 'android-library'
apply plugin: 'android-maven'

version = "1.0.0"
group = "com.somepackage"

buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
    }

    dependencies {
        classpath 'com.github.dcendents:android-maven-plugin:1.0'
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 10
    }
}

repositories {
    maven { url 'http://www.bugsense.com/gradle/' }
}

dependencies {
    provided 'com.google.android.gms:play-services:+'
    provided 'com.android.support:appcompat-v7:+'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.bugsense.trace:bugsense:3.6'
    compile 'commons-net:commons-net:3.3'
}

次に、を使用してローカルのmavenリポジトリにデプロイしていgradle installます。デプロイされたライブラリのPOMファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sprezzat</groupId>
  <artifactId>app</artifactId>
  <version>1.0.0</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>com.bugsense.trace</groupId>
      <artifactId>bugsense</artifactId>
      <version>3.6</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-net</groupId>
      <artifactId>commons-net</artifactId>
      <version>3.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

そして最後に、上記のライブラリを依存関係として使用する私のandroidアプリケーションの設定をgradleします:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    mavenLocal()
}

android {
    compileSdkVersion 15
    buildToolsVersion "19.0.2"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }
}

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.somepackage:LIBRARY_NAME:1.0.0@aar'
}

そして、電話でアプリケーションをデプロイした後NoClassDefFoundError、Androidライブラリのコンパイル依存関係に属するクラスを取得しています。

を使用して私のAndroidアプリケーションの依存関係を検査するgradle dependencies

apk - Classpath packaged with the compiled main classes.
+--- com.google.android.gms:play-services:+ -> 4.3.23
|    \--- com.android.support:support-v4:19.0.1 -> 19.1.0
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- com.somepackage:LIBRARY_NAME:1.0.0

上記のツリーによると、すべての推移的な依存関係は検出されません。問題はどこにあり、どのように正しく行う必要がありますか?


1
gradle dependenciesアプリの実行の出力を調べましたか?
CommonsWare 2014

そして、本当にprovidedそこにキーワードが欲しいと確信していますか?Xavによると、このような依存関係はAPKパッケージ化されていません。APKにパッケージ化することをお勧めします。
CommonsWare 2014

gradle dependenciesアンドロイドライブラリの@CommonsWare :デフォルト-デフォルトのアーティファクトの設定。+ --- com.google.code.gson:gson:2.2.4 + --- com.bugsense.trace:bugsense:3.6 \ --- commons-net:commons-net:3.3
mkorszun

そのようなローカルAARファイルが機能することは知りません-それらはローカルのMavenリポジトリーに移動して、そのように参照される必要があると思います。しかし、私が実際に言及しgradle dependenciesたのはアプリの実行であり、誰かが「アプリ」と名付けることにしたライブラリではありません。
CommonsWare 2014

@CommonsWareは更新された質問を参照してください。ライブラリをローカルのmavenリポジトリにインストールしましたが、これは役に立ちません。
mkorszun 2014

回答:


87

transitive私のaar依存関係の属性を設定することで問題を解決しました:

compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
    transitive=true
}

3
@PeterNiederwieser @aar原因を省略すると、Gradleは.jarファイルとしてアーティファクトを取得しようとします。これはビルドを強制終了します。
cwc 2014

4
うまくいきませんでした。正確な問題があります。私には2つのライブラリーがあり、そのうちの1つが他のライブラリーを使用しています。compile project(':LeafPeripheralsContract') { transitive=true }動作しませんでした。推移的であると不満を述べた。そして私はを作成し、aarそれに推移的なものを追加しようとしました。文句はありませんでしたが、他のaarパッケージにも含まれていませんでした。
tasomaniac 2014年

1
私にとってもうまくいきませんでした。依存関係にも分類子があります。それが問題かどうか疑問に思います。GradleビルドツールでAndroid Studio RC1を使用する0.14.4。
lostintranslation 2014年

1
うん、もしあなたが分類子を使っているなら、推移的なdepが機能するようには見えない。ここを見て:code.google.com/p/android/issues/...を
lostintranslation

2
.jarと.aarの両方のアーティファクトがある場合、これが@aarを使用して推移的表現を含める唯一のソリューションです。
Jeffrey Blattman、2015年

18

「@aar」は使用しないでください。「@」を「Artifact only notation」に変更した場合、「@」を使用して依存性を推移的にしたい場合は、「transitive = true」を追加してください。


2
この答えは役に立ちます。以前のコメントにタイプミスがあったので、それを削除しました。あなたの答えをありがとう、良い一日を:)
2016年

14

ローカルでaarを使用している場合は、これを試してください。

compile(project(:your-library-name)) {
    transitive=true
}

6
こんにちは、私にはうまくいきません。ボレーライブラリを内部で使用するライブラリプロジェクトを1つ作成しました。ライブラリプロジェクトを使用して作成したaarファイルをアプリケーションに含めました。「エラー:(8、26)エラー:パッケージcom.android.volleyが存在しません」というエラーが表示されます。私のライブラリプロジェクトでは、compile(project( ':volley')){transitionive = true}を使用してボレーを含めました
マニッシュ

2
ちょっとマニッシュ、同じ問題に直面して、何か解決策を見つけましたか?
Jalpesh

同じ問題に
Alex

1
aarをflatDirとして含めていますか?:もしそうなら、私はあなたには、次のコメントを参照することになりstackoverflow.com/questions/25698160/...
FLOG

5

私は同様の問題を抱えていて、問題を解決する手順を共有できると感じました。

独自のものを公開している間は推移的な依存関係を使用できないという基本的な考え方は、予想される推移的な依存関係でファイルが生成されaarないこと.pomです。

私は'maven-publish'自分のAndroid aar依存関係のプラグインを使用して、自分のプライベートMavenリポジトリに公開していました。他のプロジェクトがにaar依存関係を追加していたときに、推移的な依存関係は解決されませんでしたbuild.gradle。したがって、ここでは、.pomを発行してaarいるときにファイルを変更するために何をしたかを示します。

ここで注意すべき重要なことは、推移的な動作を持たせたい依存関係は、次のようにapiライブラリプロジェクトのbuild.gradleファイルでを使用してインポートする必要があるということです。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    api 'com.android.volley:volley:1.0.0'
    api "com.google.code.gson:gson:$globalGsonVersion"
}

先ほど言ったようにmaven-publishaar依存関係を公​​開するためにプラグインを使用していたため、gradleでの公開タスクは次のようになります。

publishing {
    publications {
        mavenAar(MavenPublication) {
            from components.android
        }

        mavenJava(MavenPublication) {
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                // Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each
                configurations.api.allDependencies.each {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }

    repositories {
        maven {
            // Your repository information goes here
        }
    }
}

したがって、別のmavenJavaタスクを使用して、.pomファイルをaar依存関係として他のモジュールに追加したときに.pom情報が取得され、推移的な依存関係がダウンロードされるように、プライベートMavenリポジトリにファイルを公​​開しました。

答えを完了するには、これが、インポートbuild.gradleaarれた自分に公開された独自のファイルに依存関係を追加する方法です。

api('com.example.masudias:my_lib:1.0.0@aar') {
    transitive = true
}

2

transitiveつまり、コンシューマー(アプリなど)にはプロデューサーとすべてのプロデューサーの依存関係(ライブラリなど)が含まれます。ビルド時間が長くなり、依存バージョンでいくつかの問題が発生する可能性があります

デフォルトでは、Gradle依存関係には transitive = true

api ('com.package:library:0.0.1')
//the same
api ('com.package:library:0.0.1') {
    transitive = true
}

使用する@artifact notationtransitive = false

api ('com.package:library:0.0.1@aar')
//the same
api ('com.package:library:0.0.1@aar') {
    transitive = false
}

0

私にとって、完全な公開ソリューションは次のようになります。


apply plugin: 'com.github.dcendents.android-maven'

group = GROUP
version = VERSION

// you could move it to env variable or property
def publishFlavorless = true
def firstTask = null

android.libraryVariants.all { variant ->

    if (variant.name.toLowerCase().contains("debug")) {
        // Workaround for https://github.com/gradle/gradle/issues/1487
        if (publishFlavorless && firstTask == null) {
            def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
            firstTask = bundleTask
            artifacts {
                archives(firstTask.archivePath) {
                    builtBy firstTask
                    name = project.name
                }
            }
        }
        return
    }

    def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]

    artifacts {
        archives(bundleTask.archivePath) {
            classifier variant.flavorName
            builtBy bundleTask
            name = project.name
        }
    }
}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom.project {
            name POM_NAME
            artifactId POM_ARTIFACT_ID
            // For aar it is equal to 'aar' with jar transitive dependencies won't work
            packaging POM_PACKAGING
            description POM_DESCRIPTION
        }
    }
}

transitive = trueブロックはよくとして必要とされて...


-1

依存関係の最後に@aarを追加するだけでうまくいきました。

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.