Gradle을 사용하여 aar 라이브러리에 대한 전이 종속성이 해결되지 않았습니다.


94

나는 잠시 조사했고 아마 여기에서 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 repo에 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 애플리케이션 종속성 검사 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

그리고 정말로 provided거기 에 키워드 를 원 하십니까? Xav에 따르면 이러한 종속성은 APK에 패키징되지 않으며 APK에 패키징 되기를 원할 것이라고 생각합니다.
CommonsWare

gradle dependencies내 안드로이드 lib 용 @CommonsWare : default- 기본 아티팩트에 대한 구성. + --- com.google.code.gson : gson : 2.2.4 + --- com.bugsense.trace : bugsense : 3.6 \ --- commons-net : commons-net : 3.3
mkorszun 2014

나는 그와 같은 로컬 AAR 파일이 작동한다는 것을 알지 못합니다. 로컬 Maven 저장소로 가서 그런 식으로 참조해야한다고 생각합니다. 하지만 저는 누군가가 "app"이라는 이름을 지정하기로 결정한 라이브러리가 아니라 실행 gradle dependencies을 언급 했습니다.
CommonsWare

@CommonsWare 업데이트 된 질문을 참조하십시오. 로컬 maven repo에 라이브러리를 설치했지만 도움이되지 않습니다.
mkorszun 2014

답변:


87

transitive내 aar 종속성에 대한 속성을 설정하여 문제를 해결했습니다 .

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

3
@PeterNiederwieser @aarGradle이 아티팩트를 .jar 파일로 가져 오려고 시도 하는 원인을 생략 합니다. 이것은 빌드를 죽입니다.
cwc

4
그것은 나를 위해 일하지 않았습니다. 정확한 문제가 있습니다. 2 개의 라이브러리가 있고 그중 하나가 다른 라이브러리를 사용하고 있습니다. compile project(':LeafPeripheralsContract') { transitive=true }작동하지 않았다. 전이에 대해 불평했습니다. 그리고 저는를 만들고 aar그것에 전이를 추가하려고했습니다. 불평하지 않았지만 다른 aar 패키지에도 포함되지 않았습니다.
tasomaniac

1
나에게도 효과가 없었습니다. 종속성에도 분류 기가 있습니다. 그게 문제인지 궁금합니다. Gradle 빌드 도구 0.14.4와 함께 Android Studio RC1 사용
lostintranslation 2014

1
예, 분류기를 사용하는 경우 전이 deps가 작동하지 않는 것 같습니다. 여기를보세요 : code.google.com/p/android/issues/…
lostintranslation 2014

2
.jar 및 .aar 아티팩트가 모두있는 경우 @aar를 사용하고 전이를 포함하는 유일한 솔루션입니다.
Jeffrey Blattman 2015 년

19

"@aar"를 사용하지 말아야합니다. "@"사용이 " Artifact only notation "이되는 경우, "@"를 사용하고 전이 의존성을 원하면 "transitive = true"를 추가해야합니다.


2
이 답변은 도움이됩니다. 이전 댓글에 오타가있어서 삭제했습니다. 답변 주셔서 감사합니다. 좋은 하루 되세요 :).
srain

14

aar를 로컬에서 사용하는 경우 다음을 시도하십시오.

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

6
안녕하세요, 저에게 효과가 없습니다. 내부적으로 발리 라이브러리를 사용하는 하나의 라이브러리 프로젝트를 만들었습니다. 내 응용 프로그램에 라이브러리 프로젝트를 사용하여 만든 aar 파일을 포함했습니다. "Error : (8, 26) error : package com.android.volley does not exist"오류가 발생합니다. 내 라이브러리 프로젝트에서 내가 컴파일 ( '발리'프로젝트를 ())를 사용하여 발리를 포함했다 {이적 사실 =}
마니

2
Manish, 같은 문제에 직면 해 있습니다. 해결책을 찾았습니까?
Jalpesh

나는이 같은 문제와 함께 붙어있어
알렉스

1
aar를 flatDir로 포함하고 있습니까? 그렇다면 다음 주석을 참조하십시오. stackoverflow.com/questions/25698160/…
FloG

5

나는 비슷한 문제를 겪고 있었고 문제 해결 단계를 공유 할 수 있다고 느꼈습니다.

자신을 게시하는 동안 전이 종속성을 사용할 수 없다는 기본 아이디어 aar는 실제로 .pom예상되는 전이 종속성으로 파일이 생성 되지 않는 것 입니다.

'maven-publish'내 Android aar종속성에 플러그인을 사용하여 내 개인 Maven 저장소에 게시했습니다. 내 다른 프로젝트가 .NET Framework에 내 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-publish플러그인을 사용 하여 aar종속성 을 게시 하고 있었으므로 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.gradle파일에 자신이 게시 한 종속성을 aar가져온 파일에 추가해야합니다 .

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

3

transitive소비자 (예 : 앱)에는 생산자와 모든 생산자의 종속성 (예 : 라이브러리)이 포함됩니다. 빌드 시간이 늘어나고 종속성 버전에 문제가 발생할 수 있습니다.

기본적으로 Gradle 종속성에는 transitive = true

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

당신이 @artifact notation그것을 사용할 때transitive = 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.