WAR - Gradle многомодульное приложение - TypeNotPresentException - PullRequest
2 голосов
/ 30 марта 2020

У меня есть приложение со структурой модуля Gradle, подобной этой:

  • app - applies war
  • common/utilities
  • common/auth et c .

Модуль 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 вместе с модулями, не относящимися к приложениям. Все скомпилированные классы Kotlin из модуля app находятся в classes. Я думаю, это не работает, потому что JAR основного приложения по какой-то причине не приносит JAR модуля.

1 Ответ

0 голосов
/ 05 апреля 2020

Проблема оказалась проще, чем ожидалось. В моей структуре модулей есть такие модули:

  • : приложение
  • : общие: auth: publi c
  • : общие: auth: impl
  • : общие: данные: публичные c
  • : общие: данные: импл

Подмодули public и impl go в WAR как public.jar и impl.jar, он не обрабатывает дубликаты вообще. Так что некоторые модули были пропущены.

Я не мог понять, как изменить выводимые имена JAR, поэтому я в итоге изменил имена следующим образом:

  • : app
  • : общий: auth: data-publi c
  • : общий: auth: data-impl
  • : общий: data: data-publi c
  • : общий: данные: data-impl
...