有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    实际的解决方案不是excludegradle任务中的类,而是在设置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'
    }