我已经调查了一段时间,可能看到这里最流行的答案与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'
}
Run Code Online (Sandbox Code Playgroud)
然后我将它部署到本地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> …Run Code Online (Sandbox Code Playgroud) 我创建了一个Android库(称为MyLib中),这取决于其他图书馆可在Maven的回购协议(如GSON,翻新等).
MyLib
|
|-- Retrofit
|-- Gson
|-- ...
Run Code Online (Sandbox Code Playgroud)
MyLib打包到一个aar文件中.
目标是发布一个aar库,该库可以包含在Android应用程序(称为MyApp)中,而无需第二次指定MyLib使用的依赖项.
MyApp
|
|-- MyLib
| |-- Retrofit
| |-- gson
| |-- ...
Run Code Online (Sandbox Code Playgroud)
这是MyLib的build.gradle文件
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.google.code.gson:gson:2.3.1'
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想建立和运行MyApp的不依赖问题,我不得不使用以下的build.gradle MyApp的(如果我不指定改装和GSON作为DEPS,运行时异常被抛出,因为DEPS不可用) .
dependencies {
compile('MyLib@aar')
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.google.code.gson:gson:2.3.1'
}
Run Code Online (Sandbox Code Playgroud)
我不想在MyApp中指定MyLib中使用的依赖项,我应该如何编写build.gradle文件?
Thansk提前
在一个单独的项目中遇到此问题后,我进行了一个测试项目以验证该问题。
app。libraryone。libraryone,我向Gson添加了一个依赖项,并使用Gson使用单个静态方法添加了一个类。app,我向添加了一个依赖项libraryone。我和一起进行了简单的测试transitive = true,因为互联网似乎模糊地同意这样做可能会有所帮助。(它没有。)app,在MainActivity,我使用的班级libraryone。这行得通(只要我没有transitive = false设置)。MainActivity自身引用Gson 。无论是从Android Studio还是从命令行Gradle中,它都会给出“无法解析符号'Gson'”错误。这是不寻常的,而且令人不快,因为这意味着您必须在整个项目组中重复通用的依赖关系,并且这些类仍会包含在输出中。当然是我做错了什么,还是这是个错误?我的代码如下:
MainActivity.java(在中app)
package com.erhannis.test.dependencytest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.erhannis.test.libraryone.LibClass;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String s = LibClass.convert(new Object());
System.out.println("out: " + s);
new com.google.gson.Gson(); // This line gives a compile-time …Run Code Online (Sandbox Code Playgroud) dependencies android transitive-dependency android-gradle-plugin
当我使用*.aar文件而不是使用Gradle 4.x的模块构建应用程序并遵循有关implements和api的文档时,我希望使用api包含的aar文件包含所有依赖项,但它没有.
当你这样做
git clone https://github.com/hannesa2/aar_dependency
./gradlew clean assembleDebug
Run Code Online (Sandbox Code Playgroud)
手段
dependencies {
api project(':mylibrary')
Run Code Online (Sandbox Code Playgroud)
它工作正常.
但是当我使用lib-module的insted时,先前生成的*.aar文件作为依赖
dependencies {
api 'com.example.my.mylibrary:mylibrary-debug@aar'
Run Code Online (Sandbox Code Playgroud)
(在演示应用程序中)
git checkout with_aar
./gradlew clean assembleDebug
Run Code Online (Sandbox Code Playgroud)
我碰到了这个
任务:app:transformClassesWithDesugarForDebug线程"main"中的异常java.lang.TypeNotPresentException:在sun.invoke.util.BytecodeDescriptor的sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:85)中输入不存在的io.reactivex.ObservableTransformer .parseMethod(BytecodeDescriptor.java:63)位于com.google.devtools的java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:1067)的sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:41).在org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(未知来源)的org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(未知来源)的build.android.desugar.LambdaDesugaring $ InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:399)
因为我将这些aar工件上传到我们的Maven Nexus公司时遇到了这个问题,所以我创建了这个demo-repo以准确显示出错了什么.在演示应用程序或使用Maven我看到同样的问题.
有人知道我做错了吗?
假设我有一个库模块,其中包含一些第三方库,例如 OkHttp。当我在我的应用程序中包含这个库时,我无法使用这些第三方库。我阅读了以下文章第 1 条、
第 2 条
并尝试了
1. compile project(':library-name')
{将库的 .aar 文件作为模块导入到 myproject 中之后}
2. 我将 .aar 文件包含在 libs 文件夹中并添加了以下依赖项
build.gradle(项目级别)
allprojects {
repositories {
flatDir {
dirs 'libs'
}
}
}
Run Code Online (Sandbox Code Playgroud)
build.gradle(应用程序级别)
compile fileTree(dir: 'libs', include: ['*.jar'])
compile ('com.myapp.package:library-name:1.0.0@aar'){
transitive=true
}
Run Code Online (Sandbox Code Playgroud)
3. 与2类似,但在
build.gradle中(应用程序级别)
compile fileTree(dir: 'libs', include: ['*.jar'])
compile (name:'library-name', ext:'aar'){
transitive=true
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然无法使用我的库中存在的传递库。我收到以下异常。
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/okhttp/MediaType;
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗
编辑:
以下是我的库的 build.gradle
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'org.apache.httpcomponents:httpcore:4.4.4' …Run Code Online (Sandbox Code Playgroud) android gradle android-library android-studio android-gradle-plugin