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

The*_*ger 16 java spring jar spring-boot

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

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

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

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

有什么建议?

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

正如jst建议的那样,我改变了我的启动器以使用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>
    ...
Run Code Online (Sandbox Code Playgroud)

<layout>ZIP</layout> 触发器春季启动使用PropertiesLauncher.

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

java -jar -Dloader.main=com.mycompany.AlternateMain MyJar.jar
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

jst*_*jst 9

我认为财产不适用于您的情况.有3种不同的"发射器"(回到文档并查看).如果你正在构建一个jar,它使用JarLauncher类.如果将其切换到PropertiesLauncher,那么loader.main将非常有用.

META-INF/MANIFEST.MF

Main-Class: org.springframework.boot.loader.PropertiesLauncher
Run Code Online (Sandbox Code Playgroud)


Eri*_* B. 8

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

我有一个带有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();
}
Run Code Online (Sandbox Code Playgroud)

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

在我的情况下,我想要一个不同的启动器来创建数据库模式并退出,所以我强制命令行参数.

  • 确实这是可能的.在我的例子中,它们实际上在同一个包中,但是我的`@ComponentScan()`explicity设置不同的基本包以使用不同的排除规则进行扫描.它还允许你有不同的`@AutoConfiguration()`选项,不同的配置类等.坦率地说 - 我发现这样做比使用启动器和启动器参数指定长类名更容易; 这允许我以任何我想要的方式抽象它.我基本上在同一个jar中打包了两个独立的SpringBoot应用程序(它们共享公共类). (2认同)