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.
在我的例子中,我想要一个不同的启动器来创建数据库模式并退出,所以我强制使用命令行参数。
我想为我的 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.
在我的例子中,我想要一个不同的启动器来创建数据库模式并退出,所以我强制使用命令行参数。