Как создать исполняемый файл jar подмодуля с помощью Gradle + Spring Boot 1.5

У меня многомодульный проект:

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

Как вы говорите, in the :common module I include all the dependencies, in the :api module, you don't have that. Так что нет папки libs из-за этого. Также для какой цели вы хотите служить, потому что вы можете без необходимости добавлять эти зависимости в модуль :api

rdj7 02.08.2018 08:22

@ rdj7 Я обновил вопрос, на самом деле проблема, которую я вижу, заключается в том, что когда я запускаю jar, он говорит NoClassFound для одного из классов в общем модуле. Причина, по которой я помещаю все зависимости в общий модуль, заключается в том, что у меня на самом деле есть два модуля, оба зависят от общего модуля, а не только от модуля api.

Jun 02.08.2018 19:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
820
2

Ответы 2

Оказывается, это из-за того, что 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/…

Bwvolleyball 08.08.2018 20:10

Год спустя я наконец могу объяснить, что происходит - см. Мой ответ ниже

Bwvolleyball 13.11.2019 19:49

Причина в том, что плагин 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")
    }
}

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