更改 Spring Boot 项目以继承自定义依赖项管理

2022-09-04 04:22:53

我有一个小的Spring Boot应用程序,我必须适应使用自定义父级。Google发现了很多关于如何迁移到Spring Boot的例子,但是我对Spring Boot迁移(我一开始几乎不知道)感到茫然。

原因

简而言之,此应用程序是作为一种概念验证而开发的,开发人员选择了最先进的技术。

现在,这个应用程序将继续存在,我们需要将其集成到我们的框架中。因此,作为一个Maven项目,它应该继承我们共同的父级之一,尽管我的理解是Spring Boot项目应该继承Spring Boot启动器父POM。

[编辑]我错了:可以在没有父POM的情况下使用Spring Boot。因此,删除Spring Boot不是一项义务,但是我们的父POM包括自己的版本管理,这迫使我覆盖启动器中包含的多个版本。

为什么我们需要从父母那里继承

我们有一个企业框架用于我们所有的项目。为了使事情变得更容易,我们在父POM中管理许多框架的版本。这些版本与我们的小批处理项目中的 spring-boot-依赖项中的版本冲突的一些示例:

  • 弹簧框架(内部:3.2.4;弹簧靴 1.2.2: 4.1.5)
  • 春季批次 (ih: 2.2.0; sb: 3.0.3)
  • 速度 (ih: 1.5; sb: 1.7)
  • 朱尼特 (ih: 4.11; sb: 4.12)
  • ...(我们管理大约90个版本)

我显然不能随意升级这些版本。请记住,此框架用于许多项目,任何更改都可能产生巨大且不受控制的后果。

其他上下文

目标是获得一点弹簧批量应用。它必须从命令行获取一些输入,并在执行失败时返回退出代码。以下是启动器的核心,但我对任何更好的方法都持开放态度。12

我们的批量启动器类

如果完全放弃Spring Boot,我需要调整这个启动器类,但是,由于主要习惯于XML Spring上下文,我发现这有点困难。

// ...
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan("my.config.package")
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        // ...
        SpringApplication app = new SpringApplication(Application.class);
        app.setWebEnvironment(false);
        final Map<String, Object> maps = new HashMap<>();
        maps.put("input", "file:" + inputPath);
        app.setDefaultProperties(maps);
        ConfigurableApplicationContext ctx = app.run(args);

        JobExecutionSavingListener listener = ctx.getBean(JobExecutionSavingListener.class);

        final JobExecution jobExecution = listener.getJobExecution();
        if (jobExecution.getExitStatus() != ExitStatus.COMPLETED) {
            System.exit(12);
            return;
        }
        System.exit(0);
    }
}

问题

更改我的代码以适应我的Spring Batch应用程序的最佳方法是什么,以便我可以使用我自己的Maven父级?


答案 1

您可以使用 Spring Boot,也可以不使用 将 作为项目的父级。这在《弹簧靴参考指南》的这一节中进行了说明。spring-boot-starter-parent

将其添加到您的项目pom中仍然可以让您使用Spring Boot并拥有自己的父级。

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.2.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

现在,您可以定义自己的父级。添加以下依赖项应该会为您提供运行 Spring Batch 所需的所有 jar。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
</dependencies>

不(能够)使用Spring Boot启动器作为父级的缺点之一是,如果您需要特定版本的库,则需要包含所有依赖项。当它用作父级时,就像用版本指定属性(即)一样简单。spring-batch.version


答案 2

您仍然可以使用Spring Boot来使用Spring Batch,实际上这是推荐的方法。

此外,Spring Boot项目不需要从任何父pom继承,它们只需要在pom中包含对spring Boot库的依赖关系。

这里有一个非常漂亮和简单的例子:

弹簧批次示例

您应该了解,关于Spring Boot的唯一“特殊”之处在于,它被创建为以最少的spring配置运行独立应用程序,这与创建为在服务器上运行的传统spring-web不同。

我还忘了补充一点,如果您觉得更舒服,您仍然可以使用XML配置而不是Java配置方法。


推荐