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 许多额外的细节,但是我正在使用:
- Gradle 4.1 与
- Android Gradle 插件 3.0.1.
- 最小 sdk 22
- 目标 sdk 22
- 编译sdk 26
- 构建工具 26.0.2
我通过两个更改解决了这个问题:
正如所怀疑的那样,这是传递依赖性的问题。 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
我还使用 Retrolambda 将字节码从我的 Java 8 模块转换为 Java 7 以支持与 Android 更好的兼容性。我不确定是否需要此步骤,但它是对我有用的解决方案的一部分。
我有一个包含 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 许多额外的细节,但是我正在使用:
- Gradle 4.1 与
- Android Gradle 插件 3.0.1.
- 最小 sdk 22
- 目标 sdk 22
- 编译sdk 26
- 构建工具 26.0.2
我通过两个更改解决了这个问题:
正如所怀疑的那样,这是传递依赖性的问题。 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
我还使用 Retrolambda 将字节码从我的 Java 8 模块转换为 Java 7 以支持与 Android 更好的兼容性。我不确定是否需要此步骤,但它是对我有用的解决方案的一部分。