java - WAR - Gradle 多模块应用程序 - TypeNotPresentException

标签 java gradle war ktor

我有一个应用程序,其 Gradle 模块结构类似于:

  • app - applies war
  • common/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 依赖项被带入 lib作为 JAR 以及非应用程序模块。 app 中所有已编译的 Kotlin 类模块位于 classes .我猜它不起作用,因为由于某种原因,主应用程序 JAR 没有引入模块 JAR。

    最佳答案

    问题比预期的要简单。我的模块结构有这样的模块:

  • :应用程序
  • :common:auth:public
  • :common:auth:impl
  • :常见:数据:公共(public)
  • :common:data:impl
  • publicimpl 子模块作为 public.jarimpl.jar 进入 WAR,它根本不处理重复项。所以有些模块被遗漏了。

    我不知道如何更改输出的 JAR 名称,所以我最终更改了这样的名称:
  • :应用程序
  • :common:auth:data-public
  • :common:auth:data-impl
  • :common:data:data-public
  • :common:data:data-impl
  • 关于java - WAR - Gradle 多模块应用程序 - TypeNotPresentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60924266/

    相关文章:

    java - Java包装器作为守护程序

    JavaFX:获取ScrollPane的可见区域

    java - gRPC protobuffers Java 无法为 BlockingStub 设置 CallOptions

    android - 改造的 NoClassDefFoundError.RestAdapter$Builder

    android - 以编程方式获取模块名称

    tomcat - 通过Manifest.yml从类路径加载JKS

    java - 如何继承OAuth2AuthenticationProcessingFilter或添加自定义过滤器

    java - "MediaType.APPLICATION_JSON"的注释类型 Produces 的属性值未定义

    Android Studio 充满了错误

    java - Maven 使用 war 和 jar 构建将奇怪的工件推送到内部 repo