spring-boot - 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-boot-starter-web 中排除 tomcat,而是更改遗留应用程序模块以保留 javax.servlet-api CompileOnly
。问题中给出的示例应用程序已使用修复程序进行更新。请参阅提交以查看差异。
推荐阅读
- python - 只有朋友的帖子不显示
- localization - 使用每种语言的唯一资源文件使用 IStringLocalizer 本地化 blazor
- flutter - 如何创建 DropdownButtonFormField 的圆角(Flutter)
- windows - Lolcode:变量不存在:STDIO
- javascript - Firebase WebApp with Google SignIn 仅适用于特定域和特定用户
- python - 如何在熊猫的给定数据框中每分钟获取某个实体的计数?
- r - SPSS中的分类变量
- unicode - 有没有办法将多个字符呈现为一个真正的字体中的一个字形?
- flutter - 如何在 Dart 的子项中拥有一个具有固定类型的动态成员的类?
- jar - 如何在 Blazemeter Run 中覆盖 JMetre 插件 jar