英文:
Can Spring Boot use as command line app and as server?
问题
可以将Spring Boot应用程序用作带有命令行开关的命令行应用程序,同时也用作服务器吗?我希望用户能够使用命令参数调用应用程序,执行所需的操作,然后退出。
但是,我还希望应用程序具有作为服务器启动并监听REST请求的能力。例如,对于命令行用法:
'./myapp -n:1 -b:2',
而对于服务器模式:
'./myapp -a:server',
它会将应用程序启动为服务器。
英文:
Is it possible to use a Spring Boot app as a command-line application with command-line switches, as well as a server? I would like users to be able to invoke the app with command arguments, execute the desired action, and then exit.
However, I would also like the app to have the ability to start as a server and listen for REST requests. For example, for the command-line usage:
'./myapp -n:1 -b:2',
And for the server mode:
'./myapp -a:server'`,
it would start the app as a server.
答案1
得分: 3
当然可以。关于这个主题基本上有一个讨论 链接,但基本上你可以定义一个程序参数,然后在 main
方法中创建一个简单的 if...else
来满足你的需求:
public static void main(String[] args) {
if ("n1".equals(args[0])) {
// foo
} else {
SpringApplication.run(Bar.class, args);
}
}
英文:
Of course you can. There was a discussion for basically this topic here, but basically you can define a program argument and then create a simple if...else
in main
method for your needs:
public static void main(String[] args) {
if ("n1".equals(args[0])) {
// foo
} else {
SpringApplication.run(Bar.class, args);
}
}
答案2
得分: 2
你可以使用SpringApplicationBuilder
并根据属性设置web
参数为NONE/SERVLET,或者修改传入的参数以添加一个参数,以便Spring Boot知道该如何处理。无论哪种方式都可以工作。
public static void main(String[] args) {
var server = ObjectUtils.containsElement(args, "-a:server");
var type = server ? WebApplicationType.SERVLET : WebApplicationType.NONE;
var application = new SpringApplicationBuilder()
.sources(Bar.class)
.web(type).build();
application.run(args);
}
或者,你可以修改传入的参数,添加spring.main.web-application-type
,其值基于你传入的内容。
public static void main(String[] args) {
var server = ObjectUtils.containsElement(args, "-a:server");
var param = "spring.main.web-application-type=" + (server ? "SERVLET" : "NONE");
var argsToUse = ObjectUtils.addObjectToArray(args, param);
SpringApplication.run(Bar.class, argsToUse);
}
英文:
You've got options, you can use the SpringApplicationBuilder
and based on the property you can set the web
parameter to NONE/SERVLET or you could modify the incoming arguments to add a parameter so Spring Boot knows what to do. Either way should work.
public static void main(String[] args) {
var server = ObjectUtils.containsElement(args, "-a:server");
var type = server ? WebApplicationType.SERVLET : WebApplicationType.NONE;
var application = new SpringApplicationBuilder()
.sources(Bar.class)
.web(type).build();
application.run(args);
}
Or you could modify the incoming arguments and add spring.main.web-application-type
with the value based on what you pass in.
public static void main(String[] args) {
var server = ObjectUtils.containsElement(args, "-a:server");
var param = "spring.main.web-application-type=" + ( server ? "SERVLET" : "NONE");
var argsToUse = ObjectUtils.addObjectToArray(args, param);
SpringApplication.run(Bar.class, argsToUse);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论