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"]
}

так что добавляйте их шаг за шагом.

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