Các phụ thuộc bắc cầu không được giải quyết cho thư viện aar bằng cách sử dụng gradle


93

Tôi đã điều tra một thời gian và có lẽ đã thấy hầu hết các câu trả lời phổ biến ở đây liên quan đến phụ thuộc aarbắc cầu nhưng bằng cách nào đó, tôi vẫn không rõ cách làm cho điều này hoạt động.

Vì thế:

Tôi có thư viện android với cấu hình gradle đã cho:

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

Sau đó, tôi đang triển khai nó cho repo maven cục bộ với gradle install. Tệp POM của thư viện đã triển khai trông giống như sau:

<?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>

Và cuối cùng cấu hình gradle của ứng dụng Android của tôi bằng cách sử dụng thư viện ở trên làm phụ thuộc:

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

Và sau khi triển khai ứng dụng trên điện thoại, tôi nhận được NoClassDefFoundErrorcác lớp thuộc về phần phụ thuộc biên dịch của thư viện Android của tôi.

Kiểm tra sự phụ thuộc vào ứng dụng Android của tôi bằng cách sử dụng 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

Theo cây trên, tất cả các phụ thuộc bắc cầu không được phát hiện. Vấn đề là ở đâu và nên làm thế nào cho đúng?


1
Bạn đã kiểm tra kết quả chạy gradle dependenciesứng dụng của mình chưa?
CommonsWare

Và bạn có thực sự chắc chắn rằng bạn muốn providedtừ khóa ở đó không? Theo Xav, những phụ thuộc như vậy không được đóng gói trong APK và tôi nghĩ rằng bạn sẽ muốn những phụ thuộc đó được đóng gói trong APK.
CommonsWare

@CommonsWare gradle dependenciesfor my android lib: default - Cấu hình cho các tạo phẩm mặc định. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3
mkorszun

Tôi không biết rằng các tệp AAR cục bộ như vậy hoạt động - Tôi nghĩ chúng cần phải đi vào kho lưu trữ Maven cục bộ và được tham chiếu theo cách đó. Nhưng tôi thực sự đang đề cập đến việc chạy gradle dependenciescho ứng dụng , không phải cho một thư viện mà ai đó đã quyết định đặt tên là "ứng dụng".
CommonsWare

@CommonsWare vui lòng xem câu hỏi cập nhật. Tôi đã cài đặt thư viện vào repo maven cục bộ nhưng điều này không giúp được gì.
mkorszun

Câu trả lời:


87

Tôi đã giải quyết vấn đề của mình bằng cách đặt transitivethuộc tính cho phụ thuộc aar của mình:

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

3
@PeterNiederwieser Bỏ qua @aarnguyên nhân Gradle cố gắng lấy phần mềm dưới dạng tệp .jar. Điều này giết chết công trình.
cwc

4
Nó đã không làm việc cho tôi. Tôi có vấn đề chính xác. Tôi có 2 thư viện và một trong số đó đang sử dụng thư viện kia. compile project(':LeafPeripheralsContract') { transitive=true }đã không làm việc. Nó phàn nàn về bắc cầu. Và tôi đã tạo một aarvà cố gắng thêm chất bắc cầu vào nó. Nó không phàn nàn nhưng nó cũng không bao gồm nó trong gói aar khác.
tasomaniac

1
Cũng không làm việc cho tôi. Tôi cũng có một bộ phân loại trong phần phụ thuộc. Tự hỏi nếu đó là vấn đề. Sử dụng Android Studio RC1 với các công cụ xây dựng gradle 0.14.4.
lostintranslation

1
Đúng vậy, nếu bạn đang sử dụng bộ phân loại, có vẻ như các mã bắc cầu không hoạt động. Xem tại đây: code.google.com/p/android/issues/…
lostintranslation

2
nếu bạn có cả tạo tác .jar và .aar, đây là giải pháp duy nhất để sử dụng @aar và bao gồm các phép chuyển tiếp.
Jeffrey Blattman

18

bạn không nên sử dụng "@aar", nếu sử dụng "@" trở thành " Ký hiệu chỉ tạo tác ", nếu bạn muốn sử dụng "@" và muốn có tính bắc cầu phụ thuộc, bạn nên thêm "transitive = true"


2
Câu trả lời này là hữu ích. Có một lỗi đánh máy trong nhận xét trước đây của tôi và tôi đã xóa nhận xét đó. Cảm ơn câu trả lời của bạn, chúc một ngày tốt lành :).
srain

14

Hãy thử điều này nếu bạn đang sử dụng aar cục bộ:

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

6
Xin chào, nó không hoạt động với tôi. Tôi đã tạo một dự án thư viện sử dụng thư viện volley nội bộ. Tôi đã bao gồm tệp aar được tạo bằng dự án thư viện trong ứng dụng của mình. Tôi nhận được lỗi "Error: (8, 26) error: package com.android.volley không tồn tại". Trong dự án thư viện của tôi, tôi đã bao gồm volley bằng cách sử dụng trình biên dịch (project (': volley')) {transitive = true}
Manish

2
Này Manish, Đối mặt với cùng một vấn đề, bạn đã tìm ra giải pháp nào chưa?
Jalpesh

Tôi bị mắc kẹt với cùng một vấn đề
Alex

1
Bạn có bao gồm aar là flatDir không? Nếu vậy, tôi sẽ giới thiệu bạn đến nhận xét sau: stackoverflow.com/questions/25698160/…
FloG

5

Tôi đang gặp sự cố tương tự và cảm thấy mình có thể chia sẻ các bước giải quyết vấn đề.

Ý tưởng cơ bản của việc không thể sử dụng các phụ thuộc bắc cầu trong khi bạn đang xuất bản của riêng mình aarthực sự là không .pomtạo tệp với các phụ thuộc bắc cầu mong đợi.

Tôi đã sử dụng 'maven-publish'plugin cho aarphụ thuộc Android của mình để xuất bản nó trong kho lưu trữ maven riêng của tôi. Các phụ thuộc bắc cầu không được giải quyết khi các dự án khác của tôi đã thêm aarphụ thuộc của tôi vào chúng build.gradle. Do đó, đây là những gì tôi đã làm để sửa đổi .pomtệp trong khi xuất bản của tôi aar.

Một điều quan trọng cần lưu ý ở đây rằng, các phần phụ thuộc mà bạn muốn có hành vi bắc cầu phải được nhập bằng cách sử dụng tệp apitrong dự án thư viện của bạn build.gradlenhư sau.

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

Như tôi đã nói trước đó, tôi đang sử dụng maven-publishplugin để xuất bản aarphụ thuộc và do đó nhiệm vụ xuất bản của tôi trong gradle trông giống như sau.

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

Do đó, tôi đã sử dụng một mavenJavatác vụ khác để xuất bản .pomtệp trong kho lưu trữ maven riêng của mình để khi aartệp được thêm làm phụ thuộc vào một số mô-đun khác, nó sẽ lấy .pomthông tin và tải xuống phụ thuộc bắc cầu.

Để hoàn thành câu trả lời, đây là cách bạn nên thêm phần phụ thuộc vào build.gradletệp cho riêng bạn đã xuất bản aarcho tôi đã nhập.

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

2

transitivecó nghĩa là người tiêu dùng (ví dụ: ứng dụng) bao gồm nhà sản xuất và tất cả các phụ thuộc của nhà sản xuất (ví dụ: thư viện). Nó làm tăng thời gian xây dựng và có thể tạo ra một số vấn đề với các phiên bản phụ thuộc

Theo mặc định, phụ thuộc Gradle có transitive = true

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

Khi bạn sử dụng @artifact notationnó cótransitive = false

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

0

Đối với tôi, giải pháp xuất bản hoàn chỉnh trông như thế này:


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

Các transitive = truekhối được yêu cầu như cũng ...


-1

Chỉ cần thêm @aar vào cuối phần phụ thuộc là những gì hiệu quả với tôi.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.