Java modules Jigsaw JPMS 模块化阻止 Spring 容器启动 rest controller 因为 org.apache.juli.logging.Log

Java modules Jigsaw JPMS modularization prevents Spring container from starting rest controller because of org.apache.juli.logging.Log

我在切换到 Java 11 并将模块添加到 Spring Boot 后遇到问题充当 REST API 的应用程序。当 运行 启动应用程序时,我没有收到任何错误,它在初始化后关闭,退出代码为 0。Tomcat 嵌入式服务器没有启动,调度服务器也没有启动,这将阻止应用程序关闭并侦听传入请求。

对我来说,它似乎没有启动嵌入式容器,因为模块化阻止了 Spring 引导自动配置来查找一些条件 Bean 来启动 REST 服务器。

没有错误。它的作用就像你 运行 没有控制器的应用程序一样,它将无错误地关闭,因为没有服务器可以阻止它。我已经在上下文中列出了 bean,HelloController 在那里,但是就像我说的那样,我找不到 运行ning 服务器应该存在的任何 bean,比如 web.servlet.DispatcherServlet.

我曾尝试搜索此内容,但不幸的是,术语模块在 Java 9 之前就已存在且具有不同的含义,因此很难找到任何答案。如果这个问题已经发布在 SO 深处,我深表歉意。

连最基本的例子我都做不出来

@SpringBootApplication()
public class SchoolsApplication {

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

}
@RestController
public class HelloController {
    @GetMapping("hello")
    public String hello(){
        return "hello";
    }
}
module controllers {
    requires spring.boot;
    requires spring.boot.autoconfigure;
    requires spring.context;
    requires spring.beans;
    requires spring.web;

    requires com.fasterxml.jackson.databind;

    opens package.controllers to spring.core;
}

我正在使用 Spring 2.3.4.RELEASE 实际上我正在使用 JDK14,但目标是 Java 11.

我尝试使用所需的模块(即 spring.webmvc、tomcat.embedded.core)或搜索要包含的确切 Spring beans,但没有成功。

编辑 显式添加 requires org.apache.tomcat.embed.core; 时,服务器启动并因错误

而崩溃
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory]: Factory method 'tomcatServletWebServerFactory' threw exception
...
java.util.ServiceConfigurationError: org.apache.juli.logging.Log: module org.apache.tomcat.embed.core does not declare `uses`

Tomcat版本是9.0.38

我设法将错误查明到 Tomcat 嵌入式服务器。 spring-web-starter 使用的版本是 tomcat-embed-core:9.0.38 。此问题已在 tomcat-embed-core:9.0.39

中得到修复
open module org.apache.tomcat.embed.core {
   ...
   uses org.apache.juli.logging.Log;
}

所以我通过maven依赖管理解决了这个问题。

   <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>9.0.39</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

   <dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>9.0.39</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>