【发布时间】:2020-07-10 10:49:24
【问题描述】:
我有一个类似 Gradle 模块结构的应用程序:
app - applies warcommon/utilities-
common/auth等
app 模块应用了 WAR 插件。部署到远程服务器时,此异常又回来了:
Caused by: java.lang.TypeNotPresentException: Type [SomeClass] not present
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:90)
at java.lang.Class.getGenericSuperclass(Class.java:777)
at org.kodein.di.TypeReference.<init>(types.kt:272)
很明显,依赖模块中的类并没有以某种方式被引入 WAR(通过 Kodein 服务定位器的使用暴露出来)——这并不直观,因为如果它被打包到 JAR 或AAR。
任何人都知道为什么会发生这种情况以及如何更改我的 Gradle 配置来修复它?
编辑:如果我展开 WAR,我会看到外部 Maven 依赖项作为 JAR 与非应用程序模块一起被带入 lib。 app 模块中所有已编译的 Kotlin 类都在 classes 中。我猜它不起作用,因为由于某种原因,主应用 JAR 没有引入模块 JAR。
【问题讨论】:
-
子项目中的 jar 文件(如
utilities)应该在lib文件夹中 - 而不是classes文件夹中。如果它们丢失了,你如何声明对它们的依赖? -
@BjørnVester 啊,对 - 是的,谢谢 - 所以模块 JAR 确实存在,通过扩展和查找“缺失”类来确认。有一个依赖图,所以是“api”和“实现”的混合。我尝试将它们全部切换为旧的“编译”语法,但这似乎没有任何区别。
-
我注意到 MANIFEST.MK 只包含一个清单版本,那里没有定义模块依赖项。我想知道这是否相关?奇怪的是,它不仅仅与 Gretty 和 WAR 插件一起工作。