Spring开机-如何指定备用启动-class? (多个入口点)

Spring Boot - How to specify an alternate start-class? (Multiple Entry Points)

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

根据他们的 documentation,属性 loader.main 指定要启动的主要 class 的名称。

我尝试了 java -jar MyJar.jar --loader.main=com.mycompany.AlternateMain,但在我的 pom.xml 中指定的开始-class 仍然是 运行(如果我从 pom.xml 中删除它,那么我在打包的时候出错了)。

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

有什么建议吗?

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

按照刚刚的建议,我更改了我的启动器以使用 PropertiesLauncher。我通过修改 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> .

我创建了我的 fat jar(mvn 包),然后像这样调用备用主程序:

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

感谢您的帮助!

我建议有一个 main 但使用 Spring 配置文件(或配置属性)到 select 一个或其他 "entry point" @Configuration class.

我认为 属性 不适用于您的情况。有 3 个不同的 "Launchers"(返回文档查看)。如果您正在构建一个 jar,它会使用 JarLauncher class。如果您将其切换到 PropertiesLauncher,那么 loader.main 会很有用。

META-INF/MANIFEST.MF

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

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

我有一个 class 里面有一个 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 classes:Application.class 和 CreateDB.class。每个 class 定义不同的 @ComponentScan 路径以及不同的 @EnableAutoConfiguration 选项和不同的 @Configuration 选项。最后,根据我的命令行参数,我可以决定是否以编程方式启用额外的 profiles/etc.

在我的例子中,我想要一个不同的启动器来创建数据库模式并退出,所以我强制使用命令行参数。