निष्क्रियता का उपयोग कर पुस्तकालय के लिए सकरात्मक निर्भरताएं हल नहीं हुई हैं


93

मैं थोड़ी देर के जांच की है और शायद सबसे लोकप्रिय जवाब यहां से संबंधित देखा आर और सकर्मक निर्भरता लेकिन किसी भी तरह यह अभी भी यह कैसे काम कर रहे बनाने के लिए मेरे लिए स्पष्ट नहीं है।

इसलिए:

मेरे पास दिए गए ग्रेडल कॉन्फिगर के साथ 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'
}

तब मैं इसे स्थानीय मावेन रेपो के साथ तैनात कर रहा हूं gradle install। तैनात पुस्तकालय की पीओएम फाइल इस प्रकार है:

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

और अंत में एक निर्भरता के रूप में पुस्तकालय से ऊपर का उपयोग करके मेरे एंड्रॉइड एप्लिकेशन का विन्यास कॉन्फ़िगर करें:

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अपने ऐप के लिए रनिंग के आउटपुट की जांच की है ?
कॉमन्सवेयर

और क्या आप वास्तव में सुनिश्चित हैं कि आप providedवहां कीवर्ड चाहते हैं ? Xav के अनुसार, इस तरह की निर्भरता एपीके में पैक नहीं की जाती है , और मुझे लगता है कि आप चाहते हैं कि उन लोगों को एपीके में पैक किया जाए।
कॉमन्सवेयर

gradle dependenciesमेरे Android lib के लिए @CommonsWare : डिफ़ॉल्ट - डिफ़ॉल्ट कलाकृतियों के लिए कॉन्फ़िगरेशन। + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: बग्स: 3.6 \ --- कॉमन्स-नेट: कॉमन्स-नेट: 3.3
mkorszun

मुझे इस बात की जानकारी नहीं है कि स्थानीय एएआर फाइलें उस काम को पसंद करती हैं - मुझे लगता है कि उन्हें स्थानीय मावेन रिपॉजिटरी में जाने और उस तरह से संदर्भित होने की आवश्यकता है। लेकिन मैं वास्तव gradle dependenciesमें ऐप के लिए चलने की बात कर रहा था , न कि उस लाइब्रेरी के लिए जिसे किसी ने "ऐप" नाम देने का फैसला किया था।
कॉमन्सवेयर

@CommonsWare कृपया अद्यतन प्रश्न देखें। मैंने स्थानीय मावेन रेपो में पुस्तकालय स्थापित किया है लेकिन यह मदद नहीं करता है।
mkorszun

जवाबों:


87

मैंने transitiveअपनी ऐर निर्भरता के लिए विशेषता सेट करके अपनी समस्या हल कर ली है :

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

3
@PeterNiederwieser @aarएक .jar फ़ाइल के रूप में विरूपण साक्ष्य को हथियाने की कोशिश करने के कारणों का कारण बनता है। यह निर्माण को मारता है।
cwc

4
इसने मेरे लिए काम नहीं किया। मुझे सटीक समस्या है। मेरे पास 2 पुस्तकालय हैं और उनमें से एक दूसरे का उपयोग कर रहा है। compile project(':LeafPeripheralsContract') { transitive=true }काम नहीं किया। इसने संक्रामक के बारे में शिकायत की। और मैंने एक बनाया aarऔर उसमें सकर्मक जोड़ने की कोशिश की। इसने शिकायत नहीं की लेकिन इसे अन्य अनार पैकेज में भी शामिल नहीं किया।
तस्मानी

1
मेरे लिए भी काम नहीं किया। मेरे पास निर्भरता में एक क्लासिफायरियर है। आश्चर्य है कि अगर यह समस्या है। एंड्रॉइड स्टूडियो आरसी 1 का उपयोग ढाल निर्माण उपकरण 0.14.4 के साथ करना।

1
हाँ, यदि आप क्लासिफायर का उपयोग कर रहे हैं, तो ऐसा नहीं लगता है कि सकर्मक deps काम कर रहे हैं। यहाँ देखें: code.google.com/p/android/issues/…
21

2
अगर आपके पास .jar और .ar दोनों कलाकृतियां हैं, तो यह @AR का उपयोग करने और ट्रांसीवर को शामिल करने का एकमात्र समाधान है।
जेफरी ब्लाटमैन

18

आपको "@AR" का उपयोग नहीं करना चाहिए, यदि "@" का उपयोग " विरूपण साक्ष्य केवल संकेतन " बन गया है , यदि आप "@" का उपयोग करना चाहते हैं और निर्भरता सकर्मक है, तो आपको "सकर्मक = सत्य" जोड़ना चाहिए।


2
यह उत्तर सहायक है। मेरी पिछली टिप्पणी में एक टाइपो था और मैंने उस एक को हटा दिया। आपके उत्तर के लिए धन्यवाद, आपका दिन शुभ हो :)।
srain

14

अगर आप स्थानीय स्तर पर आरा का उपयोग कर रहे हैं तो यह कोशिश करें:

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

6
नमस्ते, यह मेरे लिए काम नहीं कर रहा है। मैंने एक लाइब्रेरी प्रोजेक्ट बनाया है जो आंतरिक रूप से वॉली लाइब्रेरी का उपयोग करता है। मैंने अपने एप्लिकेशन में लाइब्रेरी प्रोजेक्ट का उपयोग करके बनाई गई aar फ़ाइल शामिल की है। मुझे "त्रुटि: (8, 26) त्रुटि मिल रही है: संकुल com.android.volley में मौजूद नहीं है" त्रुटि। अपने पुस्तकालय प्रोजेक्ट में, मैंने संकलन (प्रोजेक्ट (': वॉली') का उपयोग करके वॉली को शामिल किया है। {सकर्मक = सत्य}
मनीष

2
हे मनीष, इसी मुद्दे का सामना करते हुए, क्या आपको कोई समाधान मिला?
जलप्रेश

मैं एक ही समस्या के साथ फंस गया हूँ
एलेक्स

1
क्या आप आरा को फ्लैटदिर के रूप में शामिल कर रहे हैं? यदि ऐसा है, तो मैं आपको निम्नलिखित टिप्पणी का उल्लेख करूंगा: stackoverflow.com/questions/25698160/…
FloG

5

मुझे एक समान समस्या हो रही थी और मुझे लगा कि मैं समस्या को हल करने के चरणों को साझा कर सकता हूं।

जब आप अपना स्वयं aarका प्रकाशन कर रहे हैं, तो सकर्मक निर्भरता का उपयोग नहीं कर पाने का मूल विचार वास्तव में नहीं है.pom में अपेक्षित सकर्मक निर्भरताओं के साथ उत्पन्न फ़ाइल ।

मैं 'maven-publish'अपने Android aarनिर्भरता के लिए प्लगइन का उपयोग कर रहा था इसे अपने निजी मावेन रिपॉजिटरी में प्रकाशित किया। जब मेरी अन्य परियोजनाएँ 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और इसलिए ग्रेडेल में मेरा प्रकाशन कार्य निम्नलिखित की तरह दिखता है।

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 जानकारी है और सकर्मक निर्भरता को डाउनलोड करता है।

उत्तर को पूरा करने के लिए, यह है कि आपको build.gradleअपने द्वारा aarमुझे आयात किए गए प्रकाशन के लिए फ़ाइल में निर्भरता को कैसे जोड़ना चाहिए ।

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

2

transitiveइसका मतलब है कि उपभोक्ता (जैसे ऐप) में एक निर्माता और सभी निर्माता की निर्भरता (जैसे पुस्तकालय) शामिल हैं। यह बिल्ड टाइम को बढ़ाता है और निर्भरता संस्करणों के साथ कुछ समस्याएं पैदा कर सकता है

डिफ़ॉल्ट रूप से, ग्रैडल निर्भरता होती है 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

बस निर्भरता के अंत में @AR जोड़ना मेरे लिए काम कर रहा है।

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.