У меня многомодульный проект:
Root project 'platform'
+--- Project ':api'
+--- Project ':common'
а в модуле :common я включаю все зависимости, в модуле :api у меня только
apply(plugin = "org.springframework.boot")
dependencies {
implement(project(":common"))
}
Проблема в том, что когда я создаю модуль :api, из файла jar я не вижу никаких зависимостей внутри файла jar, нет BOOT-INF/libs/, только BOOT-INF/classes/.
Когда я запускаю jar с java -jar, он говорит NoClassFound для одного из классов в модуле :common.
gradle :api:bootRun работает нормально.
Есть ли какие-то другие конфигурации, которые мне следует сделать? Я использую gradle 4.9 kotlin dsl и плагин весенней загрузки 1.5.15.RELEASE
@ rdj7 Я обновил вопрос, на самом деле проблема, которую я вижу, заключается в том, что когда я запускаю jar, он говорит NoClassFound для одного из классов в общем модуле. Причина, по которой я помещаю все зависимости в общий модуль, заключается в том, что у меня на самом деле есть два модуля, оба зависят от общего модуля, а не только от модуля api.




Оказывается, это из-за того, что spring-boot-plugin 1.5.x каким-то образом не распознает implement(project(:common)), при переходе на compile(project(:common)) он работает нормально.
Последнее, что я проверял, Spring boot 1.X не был совместим с gradle 4.X - Они не обновляли версию плагина spring boot gradle до Spring Boot 2.x. Поскольку вы ограничены Gradle 3.x, это может объяснить, почему реализация не сработала, а компиляция сработала. Вот этот пост для более подробного объяснения различий: stackoverflow.com/questions/44493378/…
Год спустя я наконец могу объяснить, что происходит - см. Мой ответ ниже
Причина в том, что плагин gradle spring boot 1.5 предназначен только для gradle 2 и 3, который не поддерживает конфигурацию implementation (введенную в gradle 4).
Основываясь на эта документация, он описывает, что по умолчанию включены только конфигурации compile и runtime. При этом можно включить настраиваемую конфигурацию, чтобы она работала.
Если вы посмотрите на иерархию конфигураций gradle для gradle 5 Проиллюстрировано здесь, runtimeClasspath является корнем реализации и, следовательно, имеет все зависимости, необходимые для вашего исполняемого jar-файла.
Это означает, что для Spring boot 1.5 вы можете указать его на настраиваемую конфигурацию, чтобы она правильно создавала работающий jar:
build.gradle:
bootRepackage {
customConfiguration = 'runtimeClasspath'
}
build.gradle.kts:
import org.springframework.boot.gradle.repackage.RepackageTask
// more of the build file
tasks {
"bootRepackage"(RepackageTask::class) {
setCustomConfiguration("runtimeClasspath")
}
}
Как вы говорите,
in the :common module I include all the dependencies, in the :api module, you don't have that. Так что нет папкиlibsиз-за этого. Также для какой цели вы хотите служить, потому что вы можете без необходимости добавлять эти зависимости в модуль:api