나는 잠시 조사했고 아마 여기에서 aar 및 전이 종속성 과 관련된 가장 인기있는 답변을 보았지만 어떻게 든이 작업을 수행하는 방법이 아직 명확하지 않습니다.
그래서:
주어진 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'
}
그런 다음 로컬 maven repo에 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 애플리케이션의 gradle 구성 :
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
내 aar 종속성에 대한 속성을 설정하여 문제를 해결했습니다 .
compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
transitive=true
}
답변
“@aar”를 사용하지 말아야합니다. “@”사용이 ” Artifact only notation “이되는 경우, “@”를 사용하고 전이 의존성을 원하면 “transitive = true”를 추가해야합니다.
답변
aar를 로컬에서 사용하는 경우 다음을 시도하십시오.
compile(project(:your-library-name)) {
transitive=true
}
답변
나는 비슷한 문제를 겪고 있었고 문제 해결 단계를 공유 할 수 있다고 느꼈습니다.
자신을 게시하는 동안 전이 종속성을 사용할 수 없다는 기본 아이디어 aar
는 실제로 .pom
예상되는 전이 종속성으로 파일이 생성 되지 않는 것 입니다.
'maven-publish'
내 Android aar
종속성에 플러그인을 사용하여 내 개인 Maven 저장소에 게시했습니다. 내 다른 프로젝트가 .NET Framework에 내 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
파일이 다른 모듈에 대한 종속성으로 추가 될 때 .pom
정보를 가져오고 전이 종속성을 다운로드 하도록 개인 maven 저장소에 파일 을 게시 했습니다 .
답을 완성하려면 build.gradle
파일에 자신이 게시 한 종속성을 aar
가져온 파일에 추가해야합니다 .
api('com.example.masudias:my_lib:1.0.0@aar') {
transitive = true
}
답변
transitive
소비자 (예 : 앱)에는 생산자와 모든 생산자의 종속성 (예 : 라이브러리)이 포함됩니다. 빌드 시간이 늘어나고 종속성 버전에 문제가 발생할 수 있습니다.
기본적으로 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를 추가하는 것만으로도 효과가있었습니다.
dependencies {
implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}