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

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

如何解决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 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

解决方法

我设法将错误定位到Tomcat嵌入式服务器。 select id from users LIMIT 1000 OFFSET 5 使用的版本是spring-web-starter。该问题已在tomcat-embed-core:9.0.38中用

解决了
tomcat-embed-core:9.0.39

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

open module org.apache.tomcat.embed.core {
   ...
   uses org.apache.juli.logging.Log;
}

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