programing

gradle을 사용하는 aar 라이브러리에 대해 전이 종속성을 확인할 수 없습니다.

nicescript 2022. 10. 20. 21:34
반응형

gradle을 사용하는 aar 라이브러리에 대해 전이 종속성을 확인할 수 없습니다.

나는 한동안 조사했고 아마도 여기서 가장 인기 있는 답변은 aartransitive 의존성에 관한 것이지만, 어떻게 이것을 작동시킬지 아직 명확하지 않다.

그래서:

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

그리고 나서 나는 그것을 지역 매븐 레포에 전개할 것이다.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 응용 프로그램 종속성 검사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

위의 트리에 따르면 모든 전이 종속성이 검출되지 않습니다.어디에 문제가 있으며 어떻게 해야 합니까?

세팅으로 문제를 해결했습니다.transitive내 귀속성:

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

"@aar"를 사용하면 안 되고, "@"가 "Artifact only 표기법"이 되면, "@"를 사용하고 종속성을 타동성을 가지려면 "transitive=true"를 추가해야 합니다.

로컬에서 aar를 사용하는 경우 다음을 수행합니다.

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

저도 비슷한 문제가 있어서 문제 해결 단계를 공유할 수 있을 것 같았습니다.

자신의 것을 퍼블리싱 하는 동안 전이 종속성을 사용할 수 없다는 기본적인 생각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의존관계와 그에 따른 내 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과의 의존관계로 되면 "" (파일이 추가 "Detendant"를 합니다..pom dependencytransitive dependency를 다운로드하십시오.

정답을 할 수 있습니다. .build.gradle자신의 출판물을 위해 파일aar입한것것 것것것다다

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

추이적 의존관계

transitive소비자(예: 앱)가 생산자와 모든 생산자의 종속성(예: 라이브러리)을 포함하는 것을 의미합니다. 시간이 에서 몇 할 수 .

Gradle 에는 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
}

완전한 퍼블리싱 솔루션은 다음과 같습니다.


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블록도 필요합니다.

AAR 파일에는 전이 종속성이 포함되어 있지 않습니다.따라서 구현 대신 api를 사용해도 동작하지 않습니다.

저희 팀에서는 어플리케이션에서 사용할 라이브러리를 개발했습니다.이 라이브러리는 사내용으로만 사용하고 싶다고 생각하고 있었습니다.이전에는 동작하는 것처럼 보이는 모듈 전체를 포함했습니다.나중에 aar 파일로 이동하기로 결정했지만 classpath를 찾을 수 없다는 동일한 문제에 직면했습니다.조사 결과, 현지 메이븐 레포도 사용할 수 있다는 것을 알게 되었습니다.우리는 그것을 사용하기로 했다.

다음은 단계별 프로세스입니다.

게시 리포

1. 라이브러리의 루트 build.gradle 파일에 포함시켜야 합니다.

id 'com.github.dcendents.android-maven' version '2.0' apply false

2. 라이브러리의 모듈레벨 build.gradle 파일에서 추가해야 합니다.

a) 플러그인

id 'maven-publish'

b) gradle 파일 추가 하단에

publishing {
    publications {
        release(MavenPublication) {
            groupId = 'com.demo.android'
            artifactId = 'qrcodescanner'
            version = '1.0.0'

            afterEvaluate {
                from components.release
            }
        }
    }
    repositories {
        maven {
            name = "qrcodescanner"
            url = "${project.buildDir}/repo"

        }
    }
}

3. gradle 태스크에 따라 gradle 태스크 또는 Android studio 오른쪽 상단 모서리의 gradle 창을 사용하여 확인할 수 있는 gradle 태스크가 생성됩니다.

publishReleasePublicationToQrcodescannerRepository

4. 실행 시 지정된 경로로 리포(repo)가 생성됩니다.

gradlew publishReleasePublicationToQrcodescannerRepository
  1. 마지막 단계는 다음을 사용하여 로컬 메이브에 게시해야 합니다.

    gradlew publishToMavenLocal

정상적으로 동작하지 않는 경우는, gradlew clean and gradlew build를 실행전에 시험해 보겠습니다.

로컬 리포 사용

1. 사용하고 싶은 프로젝트의 루트 레벨 build.gradle 파일에 mavenLocal()을 다른 중앙 저장소보다 먼저 추가해야 합니다.

allprojects {
    repositories {
        mavenLocal()
        google()
        jcenter()
        maven { url "https://jitpack.io" }
        mavenCentral()
    }
}
  1. 이제 다른 의존관계와 마찬가지로 프로젝트에 의존관계를 포함시켜야 합니다.

implementation 'com.demo.android:qrcodescanner:1.0.0'포맷은 groupdId:artifactId:version을 염두에 두어야 합니다.

바로 그겁니다.

참고 자료:

라이브러리 공개

로컬 메이븐

의존관계 끝에 @aar를 붙이는 것만으로 저는 효과가 있었습니다.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}

언급URL : https://stackoverflow.com/questions/22795455/transitive-dependencies-not-resolved-for-aar-library-using-gradle

반응형