【问题标题】:Run Spring Boot jar from standard Java application从标准 Java 应用程序运行 Spring Boot jar
【发布时间】:2021-06-23 10:51:25
【问题描述】:

我有一个带有数据库、Swing UI 等的大型应用程序。现在我想为这个应用程序添加一个 REST API。 Spring Boot 允许轻松生成具有 OpenApi 文档和身份验证等有用功能的 REST API。

但是,当我从大型非 Spring Boot 应用程序中运行 Spring Boot 应用程序时,Spring Boot 应用程序会被父应用程序的依赖关系混淆,并且无法运行。

所以我的要求是:从非 Spring Boot 应用程序运行 Spring Boot 应用程序,而不受父应用程序的依赖干扰。我目前正在通过将可执行 jar 添加为依赖项然后调用来运行 Spring Boot 应用程序 org.springframework.boot.loader.JarLauncher.main(new String[0]); 运行 Spring Boot 应用程序。我不打算这样做,任何建议都将不胜感激。

【问题讨论】:

  • 您可以在同一个项目中拥有单独的模块,并为每个模块拥有单独的 build.gradle 文件。
  • @dkb 我已经尝试过了,但无法看到如何在另一个模块中运行 REST API 模块。不想让第二个模块成为 Spring Boot 应用程序,因为它是一个需要时间转换的大型项目。只要我可以从标准 Java 模块中运行 Spring Boot 模块,我就会很高兴拥有 2 个模块。我想要这样做的原因是我需要从标准的非 Spring Boot 模块中为 REST API 提供数据
  • 您可以导出纯java模块的jar并将其添加为对spring boot模块的依赖
  • 还是会有依赖问题。纯 Java 项目有许多依赖项,例如数据库、日志记录等,这些依赖项会干扰 Spring Boot,因为 Spring Boot 会尝试自动配置这些。我需要让 Spring Boot 忽略来自纯 Java 项目的所有依赖项
  • IMO 实现这一目标的最简洁方法是,正如其他人所说,完全分离这些模块(甚至是项目!) - 使工件和逻辑彼此独立。它将简化部署和进一步开发——原子性得到了回报:) 你之前说过,将它们解耦会花费你很多时间——你确定这不值得吗?你写的另一件事是这个 REST 模块依赖于桌面模块 - 为什么会这样?如果这是某些配置的问题,我敢打赌,您可以使用桌面客户​​端将使用的 REST 应用程序上的安全配置端点来实现相同的目标

标签: java spring-boot dependencies


【解决方案1】:

Spring 是一个庞大的高度可配置软件库集合,可用于设置(除其他外)REST API 端点和 OpenAPI 文档和 UI。

Spring Boot 是一个项目,通过应用如何在独立进程中运行它们的固执观点来简化使用这些库的过程。

通过询问如何在更大的应用程序中运行 Spring Boot 应用程序,您试图从固执己见的设置中获益,同时违反设置所基于的假设。我想理论上它可能会使用某种手动类加载器隔离,但是一旦你解决了依赖问题,你可能最终会遇到类版本冲突、配置位置问题等。简而言之,如果它是可能的这样做的所有努力都会抵消好处。

有两种解决问题的方法。

  1. 使用 Spring Boot 将您的 API 构建为独立进程。将新进程配置为与现有应用程序相同的数据库进行通信。如果有必要,将现有应用程序和 API(JPA 实体、DAO 类等)通用的任何代码分解到共享库中。如果您使用此选项,您将不得不在生产环境中管理多种流程,这会更加复杂 - 但在解耦扩展、发布周期、重启时间方面具有优势。请参阅关于微服务的辩论 (https://martinfowler.com/articles/microservices.html)。

  2. 使用提供 REST 和 OpenAPI 功能的 Spring 库作为现有应用程序的一部分,而不使用 Spring Boot。您需要设置 SpringMVC 才能使用 @RestController 注释类。如果您现有的应用程序是一个不错的 Web 应用程序 (https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html)。如果它尚未在网络服务器中运行,您将不得不在嵌入式网络服务器中启动 SpringMVC 框架 (https://devcenter.heroku.com/articles/create-a-java-web-application-using-embedded-tomcat)。这里有一篇关于将 OpenAPI 添加到 MVC 应用程序的好文章:https://www.baeldung.com/spring-rest-openapi-documentation

【讨论】:

  • 在标准 Java 应用程序中尝试运行 Spring Boot 应用程序似乎不是一个好主意。要么全部使用 Spring Boot,要么不使用 Spring Boot。
【解决方案2】:

您可以简单地排除自动配置依赖项。这是一个信息链接https://www.marcobehler.com/guides/spring-boot

这里有一段代码sn-p,说明应用启动时如何排除。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class)
public class Application {

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

或其他方式

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

我想分享另一个Spring Framework依赖https://www.marcobehler.com/guides/spring-framework

【讨论】:

  • 我试过了,但是有很多问题,比如@ConditionalOnClass did not find required class 最好不要使用Spring Boot
猜你喜欢
  • 2017-01-26
  • 2018-08-16
  • 2017-06-30
  • 1970-01-01
  • 2016-05-22
  • 2021-05-24
  • 2020-01-19
  • 2023-03-16
相关资源
最近更新 更多