Я работаю над многомодульным проектом 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
Рад предоставить дополнительную информацию, если потребуется.
Спасибо!
Какой из модулей должен быть развертываемым приложением весенней загрузки?
Это имеет значение? Это пример проекта, но если это имеет значение, то можно предположить, что depends-on-migration является развертываемым.




Проблема связана с тем, что вы используете 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? Есть ли способ обойти это?
Вы можете настроить spring-boot-maven-plugin для создания оригинальной банки с именем, которое можно импортировать через классификатор. См. Использование приложения Spring Boot в качестве зависимости
хороший! Я думаю, что это должно хорошо работать. Если я правильно понимаю, это создать две отдельные банки, одну для загрузочного приложения, другую как зависимость.
Не создавайте überjar, пока не создадите свое развертывание. Это должно быть в другом месте.
Запуск самого теста в порядке. Попробуйте запустить
mvnw packageв корне проекта. И да, я запустил в командной строке, и она выдает указанную ошибку