Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导:以编程方式重新启动,包括VM、程序参数和类路径_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring引导:以编程方式重新启动,包括VM、程序参数和类路径

Java Spring引导:以编程方式重新启动,包括VM、程序参数和类路径,java,spring,spring-boot,Java,Spring,Spring Boot,我们有一个spring boot web应用程序,我们从一个经过修改的扩展启动命令开始,类似于: java -classpath "..." -Dlogging.config="..." org.springframework.boot.loader.JarLauncher --debug --spring.config.location="..." 现在,我们需要以编程方式重新启动此应用程序(例如,通过端点),但我们需要确保“使用相

我们有一个spring boot web应用程序,我们从一个经过修改的扩展启动命令开始,类似于:

java -classpath "..." -Dlogging.config="..." org.springframework.boot.loader.JarLauncher --debug --spring.config.location="..."
现在,我们需要以编程方式重新启动此应用程序(例如,通过端点),但我们需要确保“使用相同的启动命令”

我发现:

@springboot应用程序
公共类应用程序{
私有静态配置应用程序上下文上下文;
公共静态void main(字符串[]args){
context=SpringApplication.run(Application.class,args);
}
公共静态void restart(){
ApplicationArguments args=context.getBean(ApplicationArguments.class);
线程=新线程(()->{
context.close();
context=SpringApplication.run(Application.class,args.getSourceArgs());
});
setDaemon(false);
thread.start();
}
}
在这种情况下,可以使用bean应用程序参数提取程序参数

到目前为止,我还没有找到一种方法来对VM参数和上面命令中所示的类路径扩展执行相同的操作


这可能吗?有没有一种更方便的方法可以在考虑到所有这些要求的情况下重新启动spring boot应用程序?

您在本教程中找到的方法不会重新启动整个JVM进程,而是关闭应用程序上下文并重新创建它。这意味着重新加载所有bean,这在逻辑上相当于重新启动,因为所有对象都由Spring或course管理

还有一种方法可以在不编写自定义代码的情况下重新启动—使用Spring Boot的执行器,该执行器具有
重新启动
端点。您可以调用端点,应用程序将以与您描述的相同的方式重新启动。看,还有很多其他的

在这两种方式中,都会有相同的JVM进程(JVM不会重新启动),因此类路径和JVM参数将保持不变(不要更改)

因此,如果您想重新启动JVM,您可以将长命令包装成某种脚本(例如,在linux上使用bash,或者在windows上使用*.bat文件)


除此之外,spring boot帮不了什么忙——从这个角度看,它是一个常规的java应用程序。

我明白了!这就解决了VM参数的问题,因为据我所知,它们不会通过这种重启被重置,因此仍然存在。类路径扩展呢?一般来说,类路径是在jvm进程启动之前提供给它的东西。在spring boot应用程序中,您还可以构建一个包含所有依赖项的jar,然后使用
java-jar app.jar
启动它,可以使用自定义类加载器动态加载java类,但这是非常高级的东西,所以我认为您不需要处理它,除非有其他选择……不幸的是,我们不能在这里使用执行器方法:-(我们使用类路径扩展而不是“胖”jar,因为我们需要坚持一个外部配置过程。但一般来说:感谢您的信息:-)您可以添加一点,JVM参数在重启时保持原样吗。然后我可以接受答案:-)@gerstams:Updated