首页 > 解决方案 > Java9 模块的 Spring 启动失败

问题描述

我有一个遗留的 java 应用程序,它是一个基于 servlet 的整体网络。我们想在单体应用之外开发新的 API。但是对单体应用的依赖是一个问题。因此,我们正在探索在遗留应用程序中使用 Java9 模块。作为第一步,我们只是通过文件夹重构将整个单体构建在一个模块下,并添加一个导出某些包的 module-info.java。然后项目中的另一个文件夹将用作基于 Spring Boot 的 API 模块。暂时它是一个带有 RestController 和 get 映射的简单应用程序。

我的 API 模块的模块信息如下。

module api_project {
    requires spring.web;  
    requires spring.boot;  
    requires spring.boot.starter.web;  
    requires spring.boot.autoconfigure;  
    opens net.ifao.api to spring.core;  
}

API模块的gradle依赖如下

dependencies {  
    implementation project(':ibetms_project')  
    implementation('org.springframework.boot:spring-boot-starter-web') {  
        exclude group: 'org.apache.tomcat.embed', module: 'tomcat-embed-core'  
    }  
    compile "javax.servlet:javax.servlet-api:3.1.0"  
}

如果您注意到,我排除了模块 tomcat-embed-core 没有它我会得到 100 多个构建错误,例如

module spring.boot reads package javax.servlet from both javax.servlet.api and org.apache.tomcat.embed.core

你可以看到我明确添加了javax.servlet-api.3.0.1。但即使我添加与否,我也可以成功构建项目,但是在服务器启动期间我收到以下错误。

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

是预期的吗?我应该添加额外的依赖项吗?我创建了一个示例应用程序以供快速参考。感谢您的帮助

标签: spring-bootjava-9

解决方案


解决方案是不要从 spring-boot-starter-web 中排除 tomcat,而是更改遗留应用程序模块以保留 javax.servlet-api CompileOnly。问题中给出的示例应用程序已使用修复程序进行更新。请参阅提交以查看差异。


推荐阅读