微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot 应用程序无法启动IllegalStateException 无法评估 DevToolsDataSourceAutoConfiguration 上的条件

如何解决Spring Boot 应用程序无法启动IllegalStateException 无法评估 DevToolsDataSourceAutoConfiguration 上的条件

我尝试使用 IntelliJ 启动我的 Spring Boot 应用程序。但是,无论我尝试实施什么解决方案来修复它,我似乎都无法使其工作。我相信这与 spring.autoconfigure 包有关,但根本问题对我来说仍然是个谜。

我正在尝试同时利用 Maven Multi Module SystemJava Platform Module System。下面是我的 pom.xmlmodule-info.java 文件和项目结构。

项目结构

Simplified Project Structure

请注意,有一个pom.xml 文件,每个子模块都有自己的 pom.xml 文件。每个子模块也有自己的 module-info.java 文件

父 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1</version>
    <name>Demo Project</name>
    <description>Demo Project Description</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <!--Add each module here -->
    <modules>
        <module>webapp</module>
        <module>persistence</module>
        <module>facade</module>
        <module>service</module>
        <module>security</module>
        <module>domain</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.5.1</version>
                    <configuration>
                        <mainClass>com.example.MainApplication</mainClass>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                            </exclude>
                        </excludes>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                    </configuration>
                </plugin>
                <plugin>
                    <!-- For testing -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.0.0-M5</version>
                    <configuration>
                        <testFailureIgnore>true</testFailureIgnore>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>

webapp pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>parent</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <!--    <version>0.0.1</version>-->

    <artifactId>webapp</artifactId>

    <dependencies>
        <!-- Add dependencies for `webapp` module here -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>facade</artifactId>
            <version>0.0.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>domain</artifactId>
            <version>0.0.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

webapp module-info.java

module webapp {
    requires domain;
    requires facade;

    requires spring.web;
    requires spring.boot;
    requires spring.boot.autoconfigure;
    requires spring.context;
}

以下是我尝试过的: 因此,当我按原样运行应用程序时,出现以下异常

Exception in thread "restartedMain" java.lang.illegalaccessexception: class org.springframework.boot.devtools.restart.RestartLauncher (in module spring.boot.devtools) cannot access class com.example.MainApplication (in module webapp) because module webapp does not export com.example to module spring.boot.devtools
    at java.base/jdk.internal.reflect.Reflection.newillegalaccessexception(Reflection.java:361)
    at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
    at java.base/java.lang.reflect.Method.invoke(Method.java:558)
    at spring.boot.devtools@2.5.1/org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

我为解决这个问题所做的是从

更改 webapp/module-info.java
module webapp {
}

open module webapp {
}

之后,我得到了以下异常

java.lang.IllegalStateException: Could not evaluate condition on org.springframework.boot.devtools.autoconfigure.DevToolsDataSourceAutoConfiguration due to javax/sql/DataSource not found. Make sure your own configuration does not rely on that class. This can also happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)
    at spring.boot.autoconfigure@2.5.1/org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:54) ~[spring-boot-autoconfigure-2.5.1.jar:na]
    at spring.context@5.3.8/org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.annotation.ConfigurationClassBeanDeFinitionReader$TrackedConditionEvaluator.shouldSkip(ConfigurationClassBeanDeFinitionReader.java:489) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.annotation.ConfigurationClassBeanDeFinitionReader.loadBeanDeFinitionsForConfigurationClass(ConfigurationClassBeanDeFinitionReader.java:140) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.annotation.ConfigurationClassBeanDeFinitionReader.loadBeanDeFinitions(ConfigurationClassBeanDeFinitionReader.java:129) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.annotation.ConfigurationClasspostProcessor.processConfigBeanDeFinitions(ConfigurationClasspostProcessor.java:343) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.annotation.ConfigurationClasspostProcessor.postProcessBeanDeFinitionRegistry(ConfigurationClasspostProcessor.java:247) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDeFinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.support.PostProcessorRegistrationDelegate.invokebeanfactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.support.AbstractApplicationContext.invokebeanfactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.8.jar:na]
    at spring.context@5.3.8/org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.8.jar:na]
    at spring.boot@2.5.1/org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.1.jar:na]
    at spring.boot@2.5.1/org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2.5.1.jar:na]
    at spring.boot@2.5.1/org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2.5.1.jar:na]
    at spring.boot@2.5.1/org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.1.jar:na]
    at spring.boot@2.5.1/org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.1.jar:na]
    at webapp/com.example.MainApplication.main(MainApplication.java:10) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at spring.boot.devtools@2.5.1/org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.5.1.jar:na]
Caused by: java.lang.NoClassDefFoundError: javax/sql/DataSource
    at spring.boot.devtools@2.5.1/org.springframework.boot.devtools.autoconfigure.DevToolsDataSourceAutoConfiguration$DevToolsDataSourceCondition.getMatchOutcome(DevToolsDataSourceAutoConfiguration.java:183) ~[spring-boot-devtools-2.5.1.jar:na]
    at spring.boot.autoconfigure@2.5.1/org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~[spring-boot-autoconfigure-2.5.1.jar:na]
    ... 21 common frames omitted
Caused by: java.lang.classNotFoundException: javax.sql.DataSource
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522) ~[na:na]
    ... 23 common frames omitted
  • 我尝试设置 spring.devtools.restart.enabled=false。出现同样的错误

  • 我尝试从依赖项列表中删除 spring-boot-devtools。没有错误日志,但启动进程错误代码 0 退出

  • 我尝试添加 h2 数据库依赖项只是为了看看会发生什么。不好。

  • 我尝试更改 spring-boot-devtools <scope> 值,甚至将其注释掉。不好。

  • 我尝试从 AutoConfiguration 中排除 DevToolsDataSourceAutoConfiguration.class。不好。

  • 我尝试将 exports com.example; 添加module-info.java。不好。

  • 如果我运行 mvn testmvn clean installmvn spring-boot:run,我不会收到任何错误并且服务器运行得很好。

  • MainApplication.java 位于 webapp/src/main/java/com/example/MainApplication.java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

为什么 spring.autoconfigure 试图找到一个 DataSourceIntelliJ 的类路径是否混乱,我需要手动更新其依赖项?如果我配置了一个合适的数据库(例如 mssql),我以后还会遇到这个问题吗?

最让我困惑的是,我没有通过键入 mvn spring-boot:run 命令触发服务器运行错误。老实说,这让我觉得问题与 IntelliJ's 类路径设置有关,而不是项目结构和配置。

任何帮助将不胜感激。谢谢。

解决方法

编辑 module-info.java 如下为我解决了问题

open module webapp {
    requires spring.web;
    requires spring.boot;
    requires spring.boot.autoconfigure;
    requires spring.context;
    
    requires org.apache.tomcat.embed.core;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?