我想为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
感谢您的帮助!
答案 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
类。