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.