gpt4 book ai didi

java - Android 多模块项目因 TypeNotPresentException 而失败

转载 作者:行者123 更新时间:2023-12-03 05:47:17 27 4
gpt4 key购买 nike

我有一个包含 16 个模块的 android 项目。其中许多是 java 模块,有些包括注释处理。我还针对 Java 1.8,包括对 lambda 和其他 Java 8 特性的支持。

我的大部分依赖项都在我的依赖项闭包中声明,但是我正在使用自定义插件添加一些依赖项。这会在构建期间添加 runtimeOnly 和实现依赖项:

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

除了应用程序之外的每个模块都可以独立构建,但是当我运行时
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 的传递依赖项。

我可以采取哪些步骤来解决此问题?有没有其他人遇到过这个问题并且能够解决?由于该项目的性质,我无法发布许多其他详细信息,但是我正在使用:
  • 带有
  • 的 Gradle 4.1
  • Android Gradle 插件 3.0.1。
  • 最小 SDK 22
  • 目标 SDK 22
  • 编译sdk 26
  • 构建工具 26.0.2
  • 最佳答案

    我能够通过两个更改来解决这个问题:

  • 正如怀疑的那样,这是传递依赖的问题。动态添加的依赖添加方法可以接受第三个参数来配置其设置。使用它来强制非传递依赖是解决方案:
    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
  • 我还使用 Retrolambda 将字节码从我的 Java 8 模块转换为 Java 7,以支持与 Android 更好的兼容性。我不确定是否需要此步骤,但它是对我有用的解决方案的一部分。
  • 关于java - Android 多模块项目因 TypeNotPresentException 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49386517/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com