私はしばらく調査しましたが、おそらくaarおよびtransitive依存関係に関連する最も一般的な回答をここで見ました。
そう:
私はAndroid指定されたgradle設定のライブラリ:
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
を使用してローカルのMavenリポジトリにデプロイします。デプロイされたライブラリの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>
そして最後に、上記のライブラリを依存関係として使用するmy Androidアプリケーションのgradle config:
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'
}
そして、電話にアプリケーションをデプロイした後、私のAndroidライブラリのコンパイル依存関係に属するクラスのNoClassDefFoundError
を取得しています。
gradle dependencies
を使用してmy Androidアプリケーションの依存関係を検査しています:
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
上記のツリーによると、すべての推移的な依存関係は検出されません。問題はどこにあり、どのように正しく行う必要がありますか?
私のaar依存関係にtransitive
属性を設定することで問題を解決しました:
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を追加するだけでうまくいきました。
dependencies {
implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
私にとって、完全な公開ソリューションは次のようになります。
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
ブロックも必要です...