Java模块Jigsaw JPMS模块化阻止了org.apache.juli.logging.Log导致Spring容器启动rest控制器

问题描述

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

在我看来,它似乎没有启动嵌入式容器,因为模块化阻止了Spring Boot Autoconfigure查找一些条件Bean来启动REST服务器。

没有错误。就像您在没有控制器的情况下运行该应用程序一样,由于没有服务器阻止该应用程序,因此它将关闭且不会出现错误。我已经在上下文中列出了这些bean,并且HelloController在其中,但是就像我说的那样,我找不到正在运行的服务器应该存在的任何bean,例如web.servlet.DispatcherServlet

我已经尝试过搜索,但是不幸的是,术语模块早在具有不同含义的Java 9之前就已经存在,这使得很难找到任何答案。我很抱歉这个问题是否已经发布。

即使是基本示例,我也无法使其工作

  • Application.java
@SpringBootApplication()
public class SchoolsApplication {

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

}
  • HelloController.java
@RestController
public class HelloController {
    @GetMapping("hello")
    public String hello(){
        return "hello";
    }
}
  • module-info.java
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 Bean,但没有成功。

编辑 明确添加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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)