Spring Boot Настройка DevTools в модульной Java
Я новичок в модулях Java. Я пытался заставить DevTools работать с модулями головоломки, но я получаю следующую ошибку
Исключение в потоке "restartedMain" java.lang.IllegalAccessException: класс org.springframework.boot.devtools.restart.RestartLauncher (в модуле spring.boot.devtools) не может получить доступ к классу com.thanosfisherman.mancala.MancalaApplication (в модуле com.thanf.mancala), поскольку модуль com.thanosfisherman.mancala не экспортирует com.thanosfisherman.mancala в модуль spring.boot.devtools
Что я должен положить в мой module-info.java
файл, чтобы приложение могло нормально работать?
module-info.java
module com.thanosfisherman.mancala {
requires spring.web;
requires spring.boot.autoconfigure;
requires spring.boot;
}
Обратите внимание, что я использую Gradle. Вот мой скрипт конфигурации gradle
buildscript {
ext {
springBootVersion = '2.1.1.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.thanosfisherman'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 11
repositories {
mavenCentral()
}
dependencies {
implementation('org.springframework.boot:spring-boot-starter-actuator')
implementation('org.springframework.boot:spring-boot-starter-web')
runtimeOnly('org.springframework.boot:spring-boot-devtools')
runtimeOnly('org.postgresql:postgresql')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
РЕДАКТИРОВАТЬ: я где-то читал, что весна использует отражение, чтобы прочитать файл модуля, поэтому я должен добавить open
Ключевое слово, как так.
open module com.thanosfisherman.mancala {
requires spring.boot.autoconfigure;
requires spring.boot;
requires spring.web;
}
Теперь мое приложение работает нормально без зависимости devtools, но снова выдает другую ошибку с зависимостью.
java.lang.IllegalStateException: Не удалось оценить условие для org.springframework.boot.devtools.autoconfigure.DevToolsDataSourceAutoConfiguration из-за того, что javax/sql/DataSource не найден. Убедитесь, что ваша собственная конфигурация не зависит от этого класса. Это также может произойти, если вы @ComponentScanning пакет springframework (например, если вы по ошибке поместили @ComponentScan в пакет по умолчанию)
2 ответа
У меня была та же проблема, но на jdk8 (без модулей), потому что мой основной класс не был публичным.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
/*public*/ class MyApp {
public static void main(String[] args) {
SpringApplication.run(LocationsTest.class, args);
}
}
Это означает, что код на пути к классам не может получить доступ к этому модулю по умолчанию. Это должно быть добавлено вручную с --add-modules
вариант Java 9 javac
,
compileJava {
options.compilerArgs += ["--add-modules", "spring.boot.devtools"]
}
так что добавляйте их шаг за шагом.