ไม่สามารถแก้ไขการอ้างอิงแบบสกรรมกริยาสำหรับไลบรารี aar โดยใช้ gradle


95

ฉันได้ตรวจสอบมาระยะหนึ่งแล้วและอาจเห็นคำตอบที่ได้รับความนิยมมากที่สุดที่นี่ซึ่งเกี่ยวข้องกับการอ้างอิงของ aarและtransitiveแต่ก็ยังไม่ชัดเจนสำหรับฉันว่าจะทำให้มันได้ผลอย่างไร

ดังนั้น:

ฉันมีห้องสมุด Android ที่มีการกำหนดค่า gradle ที่กำหนด:

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

จากนั้นฉันก็กำลังปรับใช้มันเพื่อ repo 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 ของฉันโดยใช้ไลบรารีด้านบนเป็นการอ้างอิง:

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

และคุณแน่ใจจริงๆหรือว่าต้องการprovidedคีย์เวิร์ดที่นั่น ตาม Xav การอ้างอิงดังกล่าวไม่ได้รวมอยู่ใน APKและฉันคิดว่าคุณต้องการให้สิ่งเหล่านั้นรวมอยู่ใน APK
CommonsWare

@CommonsWare gradle dependenciesสำหรับ lib android ของฉัน: ค่าเริ่มต้น - การกำหนดค่าสำหรับสิ่งประดิษฐ์เริ่มต้น + --- 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

@CommonsWare โปรดดูคำถามที่อัปเดต ฉันได้ติดตั้งไลบรารีลงใน maven repo ในเครื่องแล้ว แต่สิ่งนี้ไม่ได้ช่วย
mkorszun

คำตอบ:


88

ฉันได้แก้ไขปัญหาของฉันโดยตั้งค่าtransitiveแอตทริบิวต์สำหรับการพึ่งพา aar ของฉัน:

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

3
@PeterNiederwieser การละเว้น@aarสาเหตุที่ Gradle พยายามดึงอาร์ติแฟกต์เป็นไฟล์. jar สิ่งนี้ฆ่าการสร้าง
cwc

4
มันไม่ได้ผลสำหรับฉัน ฉันมีปัญหาแน่นอน ฉันมีห้องสมุด 2 แห่งและหนึ่งในนั้นใช้อีกแห่งหนึ่ง compile project(':LeafPeripheralsContract') { transitive=true }ไม่ทำงาน. มันบ่นเรื่องสกรรมกริยา และฉันสร้างaarและพยายามเพิ่มสกรรมกริยาเข้าไป มันไม่ได้บ่น แต่มันไม่ได้รวมไว้ในแพ็คเกจ aar อื่น ๆ ด้วย
tasomaniac

1
ไม่ได้ผลสำหรับฉันเช่นกัน ฉันมีลักษณนามในการพึ่งพาเช่นกัน สงสัยว่านั่นคือปัญหา การใช้ Android Studio RC1 พร้อมเครื่องมือสร้าง gradle 0.14.4
lostintranslation

1
ใช่ถ้าคุณใช้ตัวแยกประเภทดูเหมือนว่าสกรรมกริยาจะไม่ทำงาน ดูที่นี่: code.google.com/p/android/issues/…
lostintranslation

2
หากคุณมีทั้ง. jar และ. aar artifacts นี่เป็นวิธีเดียวที่จะใช้ @aar และรวมสกรรมกริยา
Jeffrey Blattman

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 ไม่มีข้อผิดพลาด" ในโครงการห้องสมุดของฉันฉันได้รวมวอลเลย์โดยใช้คอมไพล์ (project (': volley')) {transitive = true}
Manish

2
เฮ้ Manish กำลังเผชิญกับปัญหาเดียวกันคุณพบวิธีแก้ไขหรือไม่?
Jalpesh

ฉันติดปัญหาเดียวกัน
อเล็กซ์

1
คุณรวม aar เป็น flatDir หรือไม่? ถ้าเป็นเช่นนั้นฉันจะแนะนำคุณตามความคิดเห็นต่อไปนี้stackoverflow.com/questions/25698160/…
FloG

5

ฉันประสบปัญหาที่คล้ายกันและรู้สึกว่าสามารถแบ่งปันขั้นตอนการแก้ปัญหาได้

แนวคิดพื้นฐานของการไม่สามารถใช้การอ้างอิงสกรรมกริยาในขณะที่คุณกำลังเผยแพร่ไฟล์ของคุณเองaarนั้นแท้จริงแล้วไม่มี.pomไฟล์ที่สร้างขึ้นโดยมีการอ้างอิงที่คาดว่าจะเกิดขึ้น

ฉันใช้'maven-publish'ปลั๊กอินสำหรับการaarพึ่งพาAndroid เพื่อเผยแพร่ในที่เก็บ 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-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ไฟล์ใน repo maven ส่วนตัวของฉันดังนั้นเมื่อaarเพิ่มไฟล์เป็นการอ้างอิงกับโมดูลอื่น ๆ มันจะได้รับ.pomข้อมูลและดาวน์โหลดการพึ่งพาสกรรมกริยา

เพื่อให้คำตอบสมบูรณ์นี่คือวิธีที่คุณควรเพิ่มการอ้างอิงในbuild.gradleไฟล์สำหรับไฟล์ที่คุณaarนำเข้ามาเผยแพร่ให้ฉัน

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

4

transitiveหมายความว่าผู้บริโภค (เช่นแอป) รวมถึงผู้ผลิตและการอ้างอิงของผู้ผลิตทั้งหมด (เช่นไลบรารี) เพิ่มเวลาในการสร้างและสามารถสร้างปัญหาบางอย่างกับเวอร์ชันอ้างอิง

ตามค่าเริ่มต้น Gradle dependency มี 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.