当前位置: 首页 > 知识库问答 >
问题:

Java模块拼图JPMS模块化阻止Spring容器启动rest控制器,因为org.apache.juli.logging.log

谢鸿飞
2023-03-14

在切换到Java11并向充当REST API的Spring Boot应用程序添加模块之后,我遇到了一个问题。我没有得到任何错误时运行的应用程序,它关闭后,初始化退出代码0。Tomcat embedded服务器和dispatch服务器都不会启动,这将阻止应用程序关闭并侦听传入的请求。

null

null

我已经试着搜索了这一点,但不幸的是,术语module早在Java9之前就存在了,但它的含义不同,因此很难找到任何答案。我很抱歉,如果这个问题已经在某处发布了。

即使是最基本的例子我也不能使它工作

@SpringBootApplication()
public class SchoolsApplication {

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

}
    null
@RestController
public class HelloController {
    @GetMapping("hello")
    public String hello(){
        return "hello";
    }
}
    null
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;
}

null

null

显式添加时编辑需要org.apache.tomcat.embedb.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

共有1个答案

杜辰龙
2023-03-14

我设法将错误定位到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>
 类似资料:
  • 问题内容: 因此,截至昨天早上,我对OSGi到底是什么一无所知。 OSGi 只是一个流行语,我不断看到它反复出现,因此我终于拨出一些时间来仔细研究它。 实际上,它看起来很酷,因此,我想(从记录开始)说我在任何方面都不是反OSGi的,这也不是“打击OSGi”的问题。 归根结底,似乎OSGi实质上已经解决了Java Modularity上的JSR 277 ,该文件认识到文件规范存在缺陷,在某些特殊情况

  • 我的应用程序有Spring boot 1.3.2,我正在尝试将Spring MVC与Spring Security结合使用。 我有管理小组http://localhost:8080/admin和我的普通用户页面内容http://localhost:8080/ 如果你试图打开一个管理面板(http://localhost:8080/admin)你必须登录,如果你是常见的只需输入http://loca

  • SOFABoot 会根据 Require-Module 计算模块依赖树,例如以下依赖树表示模块B 和模块C 依赖模块A,模块E 依赖模块D,模块F 依赖模块E: 该依赖树会保证模块A 必定在模块B 和模块C 之前启动,模块D 在模块E 之前启动,模块E 在模块F 之前启动,但是依赖树没有定义模块B 与模块C,模块B、C与模块D、E、F之间的启动顺序,这几个模块之间可以串行启动,也可以并行启动。 S

  • 这是我的项目结构 父级是客户端、控制器、服务和存储库的父项目。 现在我想在controller中添加service的依赖关系,所以在controller pom.xml中添加了相同的内容 添加componentscan注释后 请帮忙

  • 我在理解容器视图控制器的实现方式时遇到了一些麻烦。 我将一个容器拖到主视图控制器中,它会自动创建嵌入式视图控制器,并通过嵌入式segue连接。然后,我可以通过从主视图控制器访问它。 我有点困惑,在飞行中创建和使用这些。即我想用它作为警报视图。我是否只是初始化视图一次,然后在每次显示被触发时更改其内容?我应该调用或只是设置隐藏/动画视图进出? 发音有困难。希望有人会说新语,能理解我。

  • 我的问题是关于测试多模块Spring Boot应用程序。 我有一个多模块spring boot REST应用程序。应用程序的结构如下: 以上就是我的应用程序的结构。 SpringBootMainApplication是主要项目。SpringbootModule是SpringBootMainApplication中的子项目。“SpringBootMainApplication.war”WAR将在WA