Весенняя загрузка с помощью thymeleaf starter исключает javassist из других зависимостей

#spring-boot #gradle #spring-boot-starter

#spring-boot #градация #spring-boot-starter #gradle

Вопрос:

У меня есть 2 проекта, 1-й проект зависит от javassist , а 2-й проект зависит от 1-го и spring-boot-starter-thymeleaf.

Сборка gradle похожа на приведенный ниже 1-й проект

 plugins {
    id 'org.springframework.boot' version '2.3.3.RELEASE'
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.javassist:javassist:3.27.0-GA'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

  

2-й проект, как показано ниже, :bar:hoge является 1-м проектом.

 plugins {
    id 'org.springframework.boot' version '2.3.3.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation project(':bar:hoge')
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
bootJar {
    mainClassName = 'com.example.koji.Main'
}
  

Если я запущу ../gradlew dependencyInsight --dependency javassist --configuration runtimeClasspath , результат будет таким, как показано ниже.

 No dependencies matching given input were found in configuration ':foo:bar:runtimeClasspath'
  

И gradlew assemble не имеет javassist.

Но если я удалю его id 'org.springframework.boot' version '2.3.3.RELEASE' из 1-го проекта или implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' из 2-го проекта, то вернется та же команда, что и ниже

 org.javassist:javassist:3.27.0-GA
--- project :bar:hoge
     --- runtimeClasspath
  

И gradlew assemble в jar есть javassist.

Есть идеи? Теперь мне нужно явно добавить зависимость javassist во 2-й проект, чтобы решить ее. Рабочий проект https://github.com/kojilin/example-multi

Комментарии:

1. Я получил рассказ о javassist , но с какой проблемой вам нужна помощь?

2. Для меня странно, что мне нужно добавить зависимость javassist во 2-м проекте. Итак, я хочу знать, почему это произошло.

Ответ №1:

Может быть, причина кроется отсюда?

https://github.com/gradle/gradle/issues/1473#issuecomment-413333723

итак, если я применил

 dependencyManagement {
    applyMavenExclusions = false
}
  

Это сохранит библиотеку в runtimeClasspath.

Ответ №2:

Если вы хотите автоматически наследовать javassist зависимость от :bar:hoge , объявите ее как api, а не implementation .

Комментарии:

1. Моя идея не в том, чтобы предоставлять javassist api. Если foo:bar зависит от :bar:hoge и :bar:hoge зависит (реализация использования eve) от javassist, должен ли конечный jar (runtimeClasspath) иметь javassist ?

2. @kojilin Однажды вы сказали: » Для меня странно, что мне нужно добавить зависимость javassist во 2-м проекте. «, затем вы говорите: » Моя идея — не раскрывать javassist api «. Решайтесь.

3. Я не понимаю, но спасибо за ваш комментарий. Если я добавляю implementation 'com.google.guava:guava:29.0-jre' в 1-й проект, даже если я не добавляю во 2-й проект, в runtimeClasspath 2-го проекта мы все еще можем видеть guava.