【springboot】springboot使用程序重新编译并启动项目

1.业务场景:

目的:通过接口调用重启项目,并重新编译java源文件,重新加载class

2.代码实现:

2.1准备代码重启工具类 (单例模式)
package org.common.cutil;

import lombok.Data;
import org.springframework.context.ConfigurableApplicationContext;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 项目重启工具类
 */
@Data
public class RestartUtil1 {

    private static RestartUtil1 restartUtil = new RestartUtil1();

    private ConfigurableApplicationContext configurableApplicationContext;
    private Class start;
    private String[] args;
    private boolean isRestart = false;

    private RestartUtil1() {
    }

    public static RestartUtil1 getInstance() {
        return restartUtil;
    }

    public void restart() {
        ExecutorService threadPool = new ThreadPoolExecutor(1, 1, 0,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(1), new ThreadPoolExecutor.DiscardOldestPolicy());
        threadPool.execute(() -> {
            //关闭服务,此种方式关闭服务不会释放内存,会导致内存不足
            while (configurableApplicationContext.isActive()) {
                configurableApplicationContext.close();
            }
            System.err.println("程序已关闭...");
            try {
                //关闭所有cmd
                Process exec = Runtime.getRuntime().exec("taskkill /f /im cmd.exe");
                while (exec.isAlive()) {
                    Thread.sleep(1000);
                    System.err.println("等待cmd关闭...");
                }
                //打开新窗口,在当前文件夹下,执行命令mvn
                Runtime.getRuntime().exec("cmd  /c start mvn spring-boot:run", null, new File("./"));
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        threadPool.shutdown();
    }
}
2.2集成springboot(启动类)
package org.jingniu;

import org.common.cutil.RestartUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

@SpringBootApplication()
@Component
public class ASeckillApplication1 {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(
                ASeckillApplication1.class, args);
        //是否重启
        restart(args, run);
    }
    private static void restart(String[] args, ConfigurableApplicationContext run) {
        RestartUtil.getInstance().setArgs(args);
        RestartUtil.getInstance().setRestart(true);
        RestartUtil.getInstance().setConfigurableApplicationContext(run);
        RestartUtil.getInstance().setStart(ASeckillApplication1.class);
    }
}
2.3使用:
package org.common.cweb;

import org.common.cutil.RestartUtil;
import org.common.cutil.Result;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/test")
public class NBTestController1 {

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    @ResponseBody
    public Result list() {
        RestartUtil instance = RestartUtil.getInstance();
        if (instance.getRestart()) instance.restart();
        return Result.success(0);
    }
}
2.4启动测试:
1.进入项目目录,即有pom的那层目录
2.cmd执行命令mvn spring-boot:run
3.调用写好的接口:第一个dos窗口关闭,第二个打开重新启动,查看资源管理器可见,java原进程已不存在

final.开发中遇见的问题:

1.项目被重启后,原来的内存未被释放,进程仍存在,导致java进程累积,致使内存不足
    问题代码:
        ExecutorService threadPool = new ThreadPoolExecutor(1, 1, 0,
                        TimeUnit.SECONDS, new ArrayBlockingQueue<>(1), new ThreadPoolExecutor.DiscardOldestPolicy());
                threadPool.execute(() -> {
                    //关闭服务,此种方式关闭服务不会释放内存,会导致内存不足
                    while (configurableApplicationContext.isActive()){
                        configurableApplicationContext.close();
                    }
                    System.err.println("程序已关闭...");
                    //重新启动后,会发现原来的进程并未被kill
                    ConfigurableApplicationContext configurableApplicationContext2 = SpringApplication.run(start, args);
                    this.configurableApplicationContext = configurableApplicationContext2;
                });
                threadPool.shutdown();
2.命令解释:
	1.Windows+R:
        ·/c close   关闭
        ·/k keep    保持
        cmd /c echo name    在当前cmd窗口下,执行echo name,完成后关闭窗口,所以此命令闪一下即关闭
        cmd /k echo name    在当前cmd窗口下,执行echo name,完成后保持窗口,所以执行完此命令后的内容仍打印出来,且窗口保留
            name
            C:\Users\Administrator>
        cmd /c start echo name    --一个dos
            打开当前cmd,执行命令start echo name,执行完后,当前cmd关闭
            start echo name命令,打开新的cmd并执行命令echo name,此窗口会被保留,仅关闭第一个窗口
        cmd /k start echo name    --两个dos
            打开当前cmd,执行命令start echo name,执行完后,当前cmd保留
            start echo name命令,打开新的cmd并执行命令echo name,此窗口仍会被保留
        taskkill /f /im cmd.exe
            强制杀掉所有的cmd进程
        cmd  /c start mvn spring-boot:run
            新开一个窗口执行命令mvn spring-boot:run
    2.java程序:
        //关闭所有cmd
        Process exec = Runtime.getRuntime().exec("taskkill /f /im cmd.exe");
        while (exec.isAlive()){
            Thread.sleep(1000);
            System.err.println("等待cmd关闭...");
        }
        //打开新窗口,在当前文件夹下,执行命令mvn
        Runtime.getRuntime().exec("cmd  /c start mvn spring-boot:run", null, new File("./"));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您的问题是如何使用Spring Boot、Gradle和多模块来启动编译项目,以及如何在IntelliJ IDEA中进行设置。下面是一个简单的步骤: 1. 创建一个Gradle多模块项目 在命令行或IntelliJ IDEA中创建一个Gradle多模块项目。在项目的根目录下创建一个settings.gradle文件,并将所有子模块列出来,如下所示: ``` include 'module1' include 'module2' ``` 然后,在每个子模块的build.gradle文件中,添加以下内容: ``` plugins { id 'org.springframework.boot' version '2.3.2.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' } ``` 2. 配置Spring Boot应用程序 在每个子模块中,创建一个Spring Boot应用程序。在每个应用程序启动类中,添加@SpringBootApplication注释。例如: ``` @SpringBootApplication public class Module1Application { public static void main(String[] args) { SpringApplication.run(Module1Application.class, args); } } ``` 3. 配置Gradle编译和运行 在根目录的build.gradle文件中,添加以下内容: ``` subprojects { apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' repositories { mavenCentral() } dependencies { testCompile('org.springframework.boot:spring-boot-starter-test') } springBoot { mainClassName = 'com.example.module1.Module1Application' } } ``` 上述代码设置了所有子模块的通用设置,如依赖项和主类。在每个子模块的build.gradle文件中,添加以下内容: ``` dependencies { implementation project(':module2') } ``` 上述代码添加了对另一个子模块的依赖关系。 4. 在IntelliJ IDEA中设置 在IntelliJ IDEA中,选择File > New > Project From Existing Sources,然后选择项目的根目录。在导入项目的向导中,选择“Gradle”作为项目类型,并设置Gradle的路径。然后,点击“Finish”按钮。 在IntelliJ IDEA的“Gradle”选项卡中,选择所有子模块,并点击“Refresh Gradle Project”按钮。 5. 启动Spring Boot应用程序 在IntelliJ IDEA中,选择需要启动的Spring Boot应用程序启动类,并点击“Run”按钮。Spring Boot应用程序将在IDEA的内置Tomcat服务器上启动。 以上就是使用Spring Boot、Gradle和多模块来启动编译项目,以及在IntelliJ IDEA中进行设置的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皇夜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值