Android 多模块项目因 TypeNotPresentException 而失败

Android multi-module project fails with TypeNotPresentException

我有一个包含 16 个模块的 android 项目。其中许多是 java 模块,有些包括注释处理。我也将 Java 1.8 作为目标,包括对 lambda 和其他 Java 8 功能的支持。

我的大部分依赖项都在我的依赖项闭包中声明,但是我使用自定义插件添加了一些依赖项。这会在构建过程中添加 运行timeOnly 和实现依赖项:

class DynamicDeps implements Plugin<Project> {
    @Override
    void apply(Project target) {
        target.dependencies.add("implementation", target.rootProject.project("myUiModule"))
        target.dependencies.add("runtimeOnly", target.rootProject.project("myBusinessLogicModule"))
    }
}

apply plugin: DynamicDeps

app 之外的每个模块都可以独立构建,但是当我 运行

gradlew clean :app:assemble

我得到以下异常:

Exception in thread "main" java.lang.TypeNotPresentException: Type org.jdom.Element not present
        at sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:85)
        at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:54)
        at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:41)
        at java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:1067)
        at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toMethodHandle(LambdaDesugaring.java:599)
        at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toJvmMetatype(LambdaDesugaring.java:586)
        at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:401)
        at org.objectweb.asm.ClassReader.a(Unknown Source)
        at org.objectweb.asm.ClassReader.b(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:401)
        at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:326)
        at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:280)
        at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:584)
Caused by: java.lang.ClassNotFoundException: Class org.jdom.Element not found
        at com.google.devtools.build.android.desugar.HeaderClassLoader.findClass(HeaderClassLoader.java:53)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:83)
        ... 14 more

我没有使用提到的库,但我的理解是这些可能是注释处理器(例如我正在使用的 Dagger)或 Mockito 的传递依赖项。

我可以采取什么步骤来解决这个问题?有没有其他人有这个问题并且能够解决?由于这个项目的性质,我无法 post 许多额外的细节,但是我正在使用:

我通过两个更改解决了这个问题:

  1. 正如所怀疑的那样,这是传递依赖性的问题。 dynamically-added 依赖添加方法可以接受第三个参数来配置它的设置。使用它来强制 non-transitive 依赖项是解决方案:

    class DynamicDeps implements Plugin<Project> {
        @Override
        void apply(Project target) {
            target.dependencies.add("implementation", target.rootProject.project("myUiModule"), { dep -> 
                dep.transitive = false
            })
            target.dependencies.add("runtimeOnly", target.rootProject.project("myBusinessLogicModule"), { dep -> 
                dep.transitive = false
            })
        }
    }
    
    apply plugin: DynamicDeps
    
  2. 我还使用 Retrolambda 将字节码从我的 Java 8 模块转换为 Java 7 以支持与 Android 更好的兼容性。我不确定是否需要此步骤,但它是对我有用的解决方案的一部分。