Невозможно использовать класс зависимостей подмодуля в тесте, выдает NoClassDefFoundError

Я работаю над многомодульным проектом maven со следующей структурой

project/
├── migration/
│   ├── src/
│   │   ├── main/
│   │   │   └── Migration.java
│   │   └── test
│   └── pom.xml
├── depends-on-migration/
│   ├── src/
│   │   ├── main (uses Migration.java - ok)
│   │   └── test (uses Migration.java - throws NoClassDefFoundError)
│   └── pom.xml (depends on migration)
└── pom.xml

Класс можно использовать (см. изображение), но он не может скомпилироваться при запуске mvnw package (см. логи)

2022-12-17T14:22:56.025+08:00  INFO 13468 --- [           main] c.b.d.DependsOnMigrationApplicationTests : Starting DependsOnMigrationApplicationTests using Java 17.0.2 with PID 13468 (started by Joseph in Z:\bwgjoseph\maven-nested-multi-module-project\depends-on-migration)
2022-12-17T14:22:56.031+08:00  INFO 13468 --- [           main] c.b.d.DependsOnMigrationApplicationTests : No active profile set, falling back to 1 default profile: "default"
2022-12-17T14:22:57.289+08:00  INFO 13468 --- [           main] c.b.d.DependsOnMigrationApplicationTests : Started DependsOnMigrationApplicationTests in 1.534 seconds (process running for 2.498)
[ERROR] Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.493 s <<< FAILURE! - in com.bwgjoseph.dependsonmigration.DependsOnMigrationApplicationTests
[ERROR] test1  Time elapsed: 0.454 s  <<< ERROR!
java.lang.NoClassDefFoundError: com/bwgjoseph/migration/Migration
        at com.bwgjoseph.dependsonmigration.DependsOnMigrationApplicationTests.test1(DependsOnMigrationApplicationTests.java:17)
Caused by: java.lang.ClassNotFoundException: com.bwgjoseph.migration.Migration
        at com.bwgjoseph.dependsonmigration.DependsOnMigrationApplicationTests.test1(DependsOnMigrationApplicationTests.java:17)

[INFO] 
[INFO] Results:
[INFO]
[ERROR] Errors: 
[ERROR]   DependsOnMigrationApplicationTests.test1:17 NoClassDefFound com/bwgjoseph/migr...
[INFO]
[ERROR] Tests run: 2, Failures: 0, Errors: 1, Skipped: 0

Это упрощенный пример, он может относиться к репозиторию (модуль миграции и зависимости от миграции)

Я не смог найти ничего похожего, самое близкое, что я смог найти, это случаи, когда они хотят использовать классы, определенные в migration/src/test, но я использую migration/src/main

Рад предоставить дополнительную информацию, если потребуется.

Спасибо!

Запуск самого теста в порядке. Попробуйте запустить mvnw package в корне проекта. И да, я запустил в командной строке, и она выдает указанную ошибку

user1778855 17.12.2022 09:13

Какой из модулей должен быть развертываемым приложением весенней загрузки?

khmarbaise 17.12.2022 11:40

Это имеет значение? Это пример проекта, но если это имеет значение, то можно предположить, что depends-on-migration является развертываемым.

user1778855 18.12.2022 05:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема связана с тем, что вы используете spring-boot-maven-plugin как в модулях migration, так и в модулях depends-on-migration.

Плагин Spring Boot Maven создает Uber-Jar с макетом, ожидаемым приложениями Spring. Оригинальный jar (без зависимостей) переименован в migration-0.0.1-SNAPSHOT.jar.original

Структура uber-jar

.
├── BOOT-INF
│   ├── classes
│   ├── classpath.idx
│   ├── layers.idx
│   └── lib
├── META-INF
├── migration-0.0.1-SNAPSHOT.zip
└── org
    └── springframework

Ваш код размещен в BOOT-INF/classes — это не типичный макет библиотеки, поэтому ClassNotFoundException.

См. Формат исполняемого файла Jar для справки.

Если вы удалите spring-boot-maven-plugin в проекте миграции, mvn package пройдет.

Спасибо, это имеет смысл, но что, если мой migration проект является spring-boot приложением и требует spring-boot-maven-plugin? Есть ли способ обойти это?

user1778855 18.12.2022 09:55

Вы можете настроить spring-boot-maven-plugin для создания оригинальной банки с именем, которое можно импортировать через классификатор. См. Использование приложения Spring Boot в качестве зависимости

Lesiak 18.12.2022 10:07

хороший! Я думаю, что это должно хорошо работать. Если я правильно понимаю, это создать две отдельные банки, одну для загрузочного приложения, другую как зависимость.

user1778855 18.12.2022 10:32

Не создавайте überjar, пока не создадите свое развертывание. Это должно быть в другом месте.

Thorbjørn Ravn Andersen 18.12.2022 19:32

Другие вопросы по теме