gradle을 사용하는 aar 라이브러리에 대해 전이 종속성을 확인할 수 없습니다.
나는 한동안 조사했고 아마도 여기서 가장 인기 있는 답변은 aar와 transitive 의존성에 관한 것이지만, 어떻게 이것을 작동시킬지 아직 명확하지 않다.
그래서:
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
마지막 단계는 다음을 사용하여 로컬 메이브에 게시해야 합니다.
gradlew publishToMavenLocal
정상적으로 동작하지 않는 경우는, gradlew clean and gradlew build를 실행전에 시험해 보겠습니다.
로컬 리포 사용
1. 사용하고 싶은 프로젝트의 루트 레벨 build.gradle 파일에 mavenLocal()을 다른 중앙 저장소보다 먼저 추가해야 합니다.
allprojects {
repositories {
mavenLocal()
google()
jcenter()
maven { url "https://jitpack.io" }
mavenCentral()
}
}
- 이제 다른 의존관계와 마찬가지로 프로젝트에 의존관계를 포함시켜야 합니다.
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
'programing' 카테고리의 다른 글
다운로드 가능한 파일을 장고에게 제공 (0) | 2022.10.20 |
---|---|
Windows의 MariaDB - 데이터베이스 엔진을 시작하려고 할 때 이 오류는 무엇입니까? (0) | 2022.10.20 |
socket.io에 대한 좋은 초보 튜토리얼? (0) | 2022.10.20 |
mysql 오류 : ERROR 1018 (HY000):'.'의 dir를 읽을 수 없습니다(errno: 13). (0) | 2022.10.20 |
(void (*)부프)(;)는 무슨 뜻입니까? (0) | 2022.10.20 |