如何解决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
解决方法
我设法将错误定位到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 举报,一经查实,本站将立刻删除。