java Gradle任务构建不包括安卓类的Jar
我正在编写一个简单的Gradle任务,它应该包含所有中间类并将它们打包到一个.jar
文件中,该任务被插入到用于构建Android库的Gradle任务链中
请注意,Android库不是打包在*.aar
归档中的,我有一些任务将构建jar,构建一些共享对象并将它们放在一个目录中
到目前为止,我写的任务如下:
task createDevJarRelease(type: Jar) {
from 'build/intermediates/classes/release'
manifest {
attributes 'Implementation-Title': 'MYJar library',
'Implementation-Version': '1.0'
}
archiveName "my-jar.jar"
doLast {
// Copy the jar in the target directory.
copy {
include "my-jar.jar"
from "build/libs/"
into "targetDir"
}
}
}
发生的事情是jar被正确地创建并放置在我的targetDir
中,但我无法在安卓项目中实际使用它,因为jar
文件与我的类一起包含来自安卓依赖项的其他类,当包含在安卓应用程序中时会导致冲突
我进入build/intermediates/classes/release
并注意到以下目录层次结构:
build/intermediates/classes/release
|_ 安卓
| |_ arch
| | |_ core
| | |_ ...
| | |_ lifecycle
| | |_ ...
| |_ support
| |_ ...
| | |_ ...
| |_ ...
|_ my
|_ package
|_ name
|_ foo.class
|_ bar.class
为了排除安卓
目录下的类,我尝试了在线找到的不同解决方案,但没有成功
我尝试在上面的Gradle任务中显式添加exclude
命令,但根本不起作用(类仍然存在)
exclude 'build/intermediates/classes/release/安卓'
使用此jar
构建应用程序时看到的错误是:
> Task :app:transformDexArchiveWithDexMergerForDebug
Dex: Error converting bytecode to dex:
Cause: com.安卓.dex.DexException: Multiple dex files define L安卓/arch/lifecycle/R;
UNEXPECTED TOP-LEVEL EXCEPTION:
com.安卓.dex.DexException: Multiple dex files define L安卓/arch/lifecycle/R;
com.安卓.dex.DexException: Multiple dex files define L安卓/arch/lifecycle/R;
at com.安卓.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
at com.安卓.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
at com.安卓.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
at com.安卓.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.安卓.dx.merge.DexMerger.merge(DexMerger.java:198)
at com.安卓.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
at com.安卓.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)
at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
FAILURE: Build failed with an exception.
项目依赖项包括:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
安卓TestImplementation('com.安卓.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.安卓.support', module: 'support-annotations'
})
implementation 'com.安卓.support:appcompat-v7:27.1.1'
testImplementation 'junit:junit:4.12'
}
# 1 楼答案
实际的解决方案不是
exclude
gradle任务中的类,而是在设置com.android.support
依赖项时使用compileOnly
而不是implementation
来更改项目的依赖项解决办法是: