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

时间:2015-06-26 15:24:12

标签: java spring jar spring-boot

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

根据他们的documentation,属性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>
    ...

<layout>ZIP</layout> triggers Spring Boot to use the PropertiesLauncher

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:8)

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

META-INF / MANIFEST.MF

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

答案 1 :(得分: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();
}

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

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

答案 2 :(得分:3)

我建议使用一个main但使用Spring配置文件(或配置属性)来选择一个或其他“入口点”@Configuration类。