Spring Boot - 如何指定备用启动类?(多个入口点)

2022-09-02 21:22:27

我想为我的Spring-Boot应用程序添加一个备用入口点。我宁愿把它当作一个胖罐子。这可能吗?

根据他们的文档,该属性指定要启动的主类的名称。loader.main

我试过了,但我的pom.xml中指定的启动类仍在运行(如果我从pom中删除它.xml那么我在打包过程中会出错)。java -jar MyJar.jar --loader.main=com.mycompany.AlternateMain

或者,我尝试过,但我不知道将所有嵌套jar添加到类路径的好方法。java -cp MyJar.jar com.mycompany.AlternateMain

有什么建议吗?

编辑:这是我使用的解决方案

根据jst的建议,我将启动器更改为使用属性启动器。我通过修改我的spring-boot-maven-plugin的配置来做到这一点。

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <mainClass>${start-class}</mainClass>
    <layout>ZIP</layout>
    ...

触发“弹簧启动”以使用属性启动器<layout>ZIP</layout>

我创建了我的胖罐(mvn包),然后像这样调用备用主:

java -jar -Dloader.main=com.mycompany.AlternateMain MyJar.jar

感谢您的帮助!


答案 1

我采用了不同的方法,并使用命令行参数来确定要将哪个类用作我的 SpringApplication 类。我只有一个main()方法,但是基于命令行参数使用具有不同配置的不同应用程序类。

我有一个带有main()的类:

public static void main(String[] args) {
    SpringApplication app;
    if( ArrayUtils.contains(args, "--createdb")){
        app = new SpringApplication(CreateDB.class);
        args = (String[])ArrayUtils.add(args, "--spring.jpa.hibernate.ddl-auto=create");
    } else {
        app = new SpringApplication(Application.class);
    }

    app.setWebEnvironment(false);
    app.setShowBanner(false);
    app.addListeners(new ConfigurationLogger());

    // launch the app
    ConfigurableApplicationContext context = app.run(args);

    // finished so close the context
    context.close();
}

但是我有2个不同的SpringApplication类:Application.class和CreateDB.class。每个类定义不同的路径以及不同的选项和不同的选项。最后,根据我的命令行参数,我可以决定是否以编程方式启用其他配置文件/等。@ComponentScan@EnableAutoConfiguration@Configuration

在我的情况下,我希望一个不同的启动器来创建数据库架构并退出,所以我强制了命令行参数。


答案 2

我不相信财产会适用于您的情况。有3种不同的“启动器”(返回文档并查看)。如果你正在构建一个 jar,它使用 JarLauncher 类。如果你把它切换到 PropertiesLauncher,那么 loader.main 会很有用。

元 INF/MANIFEST。中频

Main-Class: org.springframework.boot.loader.PropertiesLauncher

推荐