从标准Java应用程序运行Spring引导jar

从标准Java应用程序运行Spring引导jar,java,spring-boot,dependencies,Java,Spring Boot,Dependencies,我有一个带有数据库、Swing UI等的大型应用程序。现在我想为这个应用程序添加一个REST API。springboot允许轻松生成restapi,它具有OpenApi文档和身份验证等有用功能 但是,当我从大型非Spring启动应用程序中运行Spring启动应用程序时,Spring启动应用程序会被父应用程序的依赖项弄糊涂,无法运行 因此,我的要求是:在不受父应用程序的依赖性干扰的情况下,使用非Spring启动应用程序运行Spring启动应用程序。我目前正在运行SpringBoot应用程序,将可

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

但是,当我从大型非Spring启动应用程序中运行Spring启动应用程序时,Spring启动应用程序会被父应用程序的依赖项弄糊涂,无法运行

因此,我的要求是:在不受父应用程序的依赖性干扰的情况下,使用非Spring启动应用程序运行Spring启动应用程序。我目前正在运行SpringBoot应用程序,将可执行jar添加为依赖项,然后调用
org.springframework.boot.loader.JarLauncher.main(新字符串[0])

运行Spring引导应用程序。我不打算这样做,任何建议都将不胜感激。

Spring是一个巨大的高度可配置的软件库集合,可用于设置REST API端点、OpenAPI文档和UI

SpringBoot是一个简化使用这些库的过程的项目,它应用了一个关于如何在独立过程中运行这些库的观点

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

解决这个问题有两种方法

  • 使用SpringBoot将API构建为一个独立的进程。将新进程配置为与现有应用程序的数据库对话。如有必要,将现有应用程序和API(JPA实体、DAO类等)共有的代码放入共享库中。如果使用此选项,您将不得不在生产环境中管理多种类型的流程,这将更加复杂,但在解耦扩展、发布周期、重新启动时间方面具有优势。请参阅关于微服务的辩论()

  • 使用提供REST和OpenAPI功能的Spring库作为现有应用程序的一部分,而不使用Spring引导。为了使用@RestController注释类,您需要设置SpringMVC。如果您现有的应用程序是一个还不错的web应用程序()。如果它尚未在Web服务器中运行,则必须在嵌入式Web服务器()中启动SpringMVC框架。这里有一篇关于将OpenAPI添加到MVC应用程序的好文章:


  • 您可以简单地排除自动配置依赖项。这里有一个信息链接

    下面是如何在应用程序启动时排除的代码片段

    @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依赖项

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