গ্রেড গ্রেড ব্যবহার করে আর লাইব্রেরির জন্য সংক্ষিপ্ত নির্ভরতাগুলি সমাধান করা হয় না


95

আমি কিছুক্ষণ তদন্ত করেছি এবং সম্ভবত এখানে আড় এবং ট্রানজিটিভ নির্ভরতা সম্পর্কিত সর্বাধিক জনপ্রিয় উত্তরগুলি দেখেছি তবে কীভাবে এটি কাজ করবেন তা আমার পক্ষে এখনও পরিষ্কার নয়।

সুতরাং:

প্রদত্ত গ্রেড কনফিগার সহ আমার অ্যান্ড্রয়েড লাইব্রেরি রয়েছে:

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। মোতায়েন করা লাইব্রেরির 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>

এবং অবশেষে উপরের লাইব্রেরিটিকে নির্ভরতা হিসাবে ব্যবহার করে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির গ্রেড কনফিগারেশন:

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আমার অ্যান্ড্রয়েড লাইব্রেরির নির্ভরতা সংকলন সম্পর্কিত ক্লাসগুলি পাচ্ছি।

আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশন নির্ভরতাগুলি পরীক্ষা করে এটি ব্যবহার করে 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

উপরের গাছ অনুসারে, সমস্ত ট্রানজিটিভ নির্ভরতা সনাক্ত করা যায় না। সমস্যাটি কোথায় এবং কীভাবে এটি সঠিকভাবে করা উচিত?


4
আপনি কি gradle dependenciesআপনার অ্যাপ্লিকেশনটির জন্য চলমান আউটপুট পরীক্ষা করেছেন ?
কমন্সওয়্যার

এবং আপনি কি নিশ্চিত যে আপনি providedকীওয়ার্ডটি সেখানে চান ? জাভের মতে, এই ধরনের নির্ভরতাগুলি এপিএকে প্যাকেজ করা হয় না এবং আমি মনে করি যে আপনি এপিএকে প্যাকেজড করতে চান।
কমন্সওয়্যার

gradle dependenciesআমার অ্যান্ড্রয়েড লাইবের জন্য @ কমন্সওয়্যার : ডিফল্ট - ডিফল্ট শৈল্পিকগুলির জন্য কনফিগারেশন। + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: বাগসনেস: 3.6 \ --- কমন্স-নেট: কমন্স-নেট: 3.3
মেকারসুন

আমি জানি না যে স্থানীয় এআর ফাইলগুলি সেই কাজের মতো হয় - আমি মনে করি তাদের একটি স্থানীয় মাভেন সংগ্রহশালায় যেতে হবে এবং সেভাবে রেফারেন্স করা দরকার। তবে আমি সত্যিই অ্যাপটিরgradle dependencies জন্য দৌড়ের কথা উল্লেখ করছি , এমন কোনও লাইব্রেরির জন্য নয় যা কেউ "অ্যাপ" নামকরণ করার সিদ্ধান্ত নিয়েছে।
কমন্সওয়্যার

@ কমন্সওয়্যার দয়া করে আপডেট হওয়া প্রশ্নটি দেখুন। আমি স্থানীয় মেভেন রেপোতে লাইব্রেরি ইনস্টল করেছি তবে এটি কোনও লাভ করে না।
mkorszun

উত্তর:


88

transitiveআমার আয়ার নির্ভরতার জন্য বৈশিষ্ট্য নির্ধারণ করে আমি আমার সমস্যার সমাধান করেছি :

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

4
@ পিটারনিডেরউইজার @aarকারণগুলি বাদ দিয়ে গ্রেডলকে .jar ফাইল হিসাবে নিদর্শনটি ধরার চেষ্টা করছেন। এটি বিল্ডটিকে হত্যা করে।
সিডব্লিউসি

4
এটি আমার পক্ষে কাজ করেনি। আমার ঠিক সমস্যা আছে আমার 2 টি গ্রন্থাগার রয়েছে এবং তাদের মধ্যে একটি অন্যটি ব্যবহার করছে। compile project(':LeafPeripheralsContract') { transitive=true }এটা কাজ করছে না. এটি ট্রানজিটিভ সম্পর্কে অভিযোগ করেছিল। এবং আমি একটি তৈরি করেছি aarএবং এটিতে ট্রানজিটিভ যুক্ত করার চেষ্টা করেছি। এটি অভিযোগ করেনি তবে এটি অন্যান্য আর প্যাকেজেও অন্তর্ভুক্ত করেনি।
তাসোমানিয়াক

4
আমার পক্ষেও কাজ করেনি। নির্ভরতার ক্ষেত্রে আমারও একটি শ্রেণিবদ্ধ রয়েছে। সমস্যা থাকলে ভাবছেন? গ্রেড বিল্ড সরঞ্জামগুলির সাথে অ্যান্ড্রয়েড স্টুডিও আরসি 1 ব্যবহার করে 0.14.4।
ট্রান্সলেশন

4
হ্যাঁ, আপনি যদি ক্লাসিফায়ার ব্যবহার করছেন তবে ট্রানজিটিভ ডিপস কাজের মতো মনে হচ্ছে না। এখানে দেখুন: Code.google.com/p/android/issues/…
21

4
যদি আপনার কাছে .ar এবং .aar শিল্পকর্ম উভয়ই থাকে তবে @Aar ব্যবহার করার জন্য এটিই কেবলমাত্র সমাধান এবং ট্রানজিটিভগুলি অন্তর্ভুক্ত।
জেফ্রি ব্লাটম্যান

19

আপনার "@আর" ব্যবহার করা উচিত নয়, যদি "@" ব্যবহারটি " আর্টিফ্যাক্ট কেবলমাত্র স্বরলিপি " হয়ে যায়, আপনি যদি "@" ব্যবহার করতে চান এবং নির্ভরতা ট্রানজিটিভ চান, আপনার "ট্রান্সটিটিভ = ট্রু" যোগ করা উচিত


4
এই উত্তর সহায়ক। আমার আগের মন্তব্যে একটি টাইপ ছিল এবং আমি সেটিকে মুছলাম। আপনার উত্তরের জন্য ধন্যবাদ, একটি ভাল দিন :) :)।

14

আপনি যদি স্থানীয়ভাবে আর ব্যবহার করে থাকেন তবে এটি ব্যবহার করে দেখুন:

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

6
হাই, এটি আমার পক্ষে কাজ করছে না। আমি একটি লাইব্রেরি প্রকল্প তৈরি করেছি যা অভ্যন্তরীণভাবে ভলির লাইব্রেরি ব্যবহার করে। আমি আমার অ্যাপ্লিকেশনটিতে লাইব্রেরি প্রকল্প ব্যবহার করে তৈরি করা আআর ফাইল অন্তর্ভুক্ত করেছি। আমি "ত্রুটি: (8, 26) পাচ্ছি: ত্রুটি: প্যাকেজ com.android.volley বিদ্যমান নেই"। আমার লাইব্রেরি প্রকল্পে, আমি সংকলন (প্রকল্প (': ভোলি')) ব্যবহার করে ভলিকে অন্তর্ভুক্ত করেছি {ট্রানজিটিভ = সত্য true
মণীশ

4
আরে মনীশ, একই ইস্যুটির মুখোমুখি, আপনি কি কোনও সমাধান খুঁজে পেয়েছেন?
জলপেশ

আমি একই সমস্যার সাথে আটকে আছি
অ্যালেক্স

4
আপনি কি ফ্ল্যাটডির হিসাবে আয়ারকে অন্তর্ভুক্ত করছেন? : যদি তাই হয়, আমি নিম্নলিখিত মন্তব্য কাছে পাঠাতে হবে stackoverflow.com/questions/25698160/...
প্রহার

5

আমারও অনুরূপ সমস্যা ছিল এবং আমি মনে করি যে সমস্যার সমাধানের পদক্ষেপগুলি আমি ভাগ করে নিতে পারি।

আপনি নিজের প্রকাশ করার সময় ট্রানজিটিভ নির্ভরতা ব্যবহার করতে সক্ষম না হবার প্রাথমিক ধারণাটি প্রত্যাশিত ট্রানজিট নির্ভরতা সহ ফাইলটি উত্পন্ন aarনয় .pom

আমি 'maven-publish'আমার অ্যান্ড্রয়েড 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
}

4

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

নির্ভরতার শেষে কেবল @আর যুক্ত করা আমার পক্ষে কাজ করে।

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.