代码之家  ›  专栏  ›  技术社区  ›  fredmaggiowski Alex

gradle的任务是构建jar,不包括android类

  •  1
  • fredmaggiowski Alex  · 技术社区  · 6 年前

    我正在写一个简单的分级任务,它应该包含所有的中级课程,并将它们打包到 .jar 文件中,任务被插入到用于构建android库的渐变任务链中。

    请注意,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 但没有成功。

    我试着明确地添加 exclude 命令在上面的梯度任务,但根本没有工作(阶级仍然存在)。

    exclude 'build/intermediates/classes/release/android'
    

    使用此命令生成应用程序时出现的错误 罐子 是:

    > 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'
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   fredmaggiowski Alex    6 年前

    实际的解决办法不是 exclude 中的类 jar 但要更改项目的依赖项,请使用 compileOnly 而不是 implementation 当设置 com.android.support 附属国。

    解决方案是:

    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'
    }