Java Gradle任务构建不包括android类的Jar
我正在编写一个简单的Gradle任务,它应该包含所有的中间类,并将它们打包到Java Gradle任务构建不包括android类的Jar,java,android,gradle,jar,Java,Android,Gradle,Jar,我正在编写一个简单的Gradle任务,它应该包含所有的中间类,并将它们打包到.jar文件中,该任务被插入到用于构建Android库的Gradle任务链中 请注意,Android库不是打包在*.aar存档中的,我有一些任务将构建jar,构建一些共享对象并将它们放在一个目录中 到目前为止,我写的任务如下: task createDevJarRelease(type: Jar) { from 'build/intermediates/classes/release' manifest
.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
中,但我无法在android项目中实际使用它,因为jar
文件与我的类一起还包含来自android依赖项的其他类,当包含在android应用程序中时会导致冲突
我进入了build/intermediates/classes/release
,注意到以下目录层次结构:
build/intermediates/classes/release
|_ android
| |_ arch
| | |_ core
| | |_ ...
| | |_ lifecycle
| | |_ ...
| |_ support
| |_ ...
| | |_ ...
| |_ ...
|_ my
|_ package
|_ name
|_ foo.class
|_ bar.class
为了排除android
目录下的类,我在网上尝试了不同的解决方案,但没有成功
我尝试在上面的Gradle任务中显式添加exclude
命令,但根本不起作用(类仍然存在)
使用此
jar
构建应用程序时出现的错误是:
> Task :app:transformDexArchiveWithDexMergerForDebug
Dex: Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Landroid/arch/lifecycle/R;
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/arch/lifecycle/R;
com.android.dex.DexException: Multiple dex files define Landroid/arch/lifecycle/R;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
at com.android.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'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:27.1.1'
testImplementation 'junit:junit:4.12'
}
实际的解决方案不是
排除jar
gradle任务中的类,而是在设置com.android.support
依赖项时使用compileOnly
而不是implementation
,来更改项目的依赖项
解决办法是:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compileOnly 'com.android.support:appcompat-v7:27.1.1'
testImplementation 'junit:junit:4.12'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compileOnly 'com.android.support:appcompat-v7:27.1.1'
testImplementation 'junit:junit:4.12'
}