实现思路:获取某目录下的所有jar包,根据最新的修改时间来启动该jar包(当然你也可以写死路径,就连获取也不用了),运用多线程 执行cmd命令同时关闭原程序
优点:可以部署到生产环境中,适用于一切框架,支持通过Http请求来实现重启/升级jar包
缺点:似乎无法在ide工具中测试。
声明:只在Windows环境下测试过,理论上Linux只需小改即可。
核心其实就两步多线程。
package com.example.plane.handler;
import cn.hutool.core.io.FileUtil;
import lombok.AllArgsConstructor;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;
/**
* @author 乐心湖
* @date 2020/7/22 13:37
**/
public class Restart {
public static void restartMain() {
File[] files = FileUtil.ls(System.getProperty("user.dir"));
HashMap<Long, String> fileMap = new HashMap<>();
for (File file : files) {
if (file.getName().endsWith(".jar")) {
fileMap.put(file.lastModified(), file.getName());
}
}
Set<Long> longs = fileMap.keySet();
Long max = Collections.max(longs);
System.out.println(fileMap.get(max));
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "start", "java", "-jar", fileMap.get(max));
new start(pb).start();
new exit().start();
}
}
@AllArgsConstructor
class start extends Thread {
ProcessBuilder pb;
@Override
public void run() {
try {
pb.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class exit extends Thread {
@Override
public void run() {
System.exit(0);
}
}