当前位置: 首页 > 科技观察

Jarboot:强大的Java进程管理工具

时间:2023-03-17 16:47:47 科技观察

本期推荐的Jarboot是一个Java进程启动、停止、管理和诊断平台,可以对本地和远程Java进程进行管理、守护、监控和诊断。在测试环境和日常搭建的集成环境中,可以将一系列编译输出和其他jar文件放到约定的目录下,Jarboot提供了友好的浏览器ui界面和http接口统一管理其启动、停止和状态监控,以及执行命令来调试目标进程。技术背景及目标Jarboot使用JavaAgent和ASM技术,将代码注入到目标Java进程中,不会对业务造成侵入。注入的代码只是用来与Jarboot的服务进行交互,实现命令交互。一些命令会修改类的字节码以进行类增强,增加了类似Arthas的命令系统,比如获取JVM信息,监控线程状态,获取线程堆栈信息等。浏览器界面管理,一键启动和停止服务进程,无需手动执行支持启动和停止优先级配置一一默认并行启动supportprocessdaemon,开启后,如果服务异常退出,会自动启动并通知support文件更新监控,开启后如果jar文件有更新,会执行调试命令自动重启,可同时远程调试多个Java进程,界面更友好安装压缩包或Docker时忽略此步骤编译Jarboot源码#先编译前端$cdjarboot-ui#需要安装第一次依赖,执行yarn或者npminstall$yarn#执行编译,yarnbuild或者npmrunbuild,开发模式可以执行yarnstartornpmrunstart$yarnbuild#切换到代码根目录,编译Java代码$cd../$mvncleaninstall启动Jarboot服务#执行startup.sh启动,Windows系统使用startup.cmd。$shstartup.sh进入登录界面,初始用户名:jarboot,默认密码:jarbootboot-starter-jarboot${jarboot.version}来实现CommandProcessorSPI接口同样,你也可以在方法上使用@Bean注解来定义命令处理器。如果不使用@Name注解,则默认使用Bean名称作为命令名称。@Name("spring.command.name")@Summary("Thecommandsummary")@Description("Thecommandusagedetail")@ComponentpublicclassDemoServiceImplimplementsDemoService,CommandProcessor{@OverridepublicStringprocess(CommandSessionsession,String[]args){使用/implementothermethod返回“SpringbootDemouser-definedcommand”...}引入spring-boot-starter-jarboot依赖时,会增加两个Spring调试命令spring.bean和spring.env。#spring.beanusage:$spring.bean[-b][-d]#Example:#获取所有beannames$spring.bean#获取bean信息$spring.bean-bbeanName#获取bean详细信息$spring.bean-bbeanName-d#sping.envUsage:$spring.env#Example:$spring.envspring.application.name如何创建自定义命令引入jarbootapi依赖io.github.majianzhengjarboot-apiprovided${jarboot.version}实现spi接口/***使用用于定义命令名称的名称注释*/@Name("demo")@Summary("Thecommandsummary")@Description("Thecommandusagedetail")publicclassDemoCommandProcessorimplementsCommandProcessor{@OverridepublicStringprocess(CommandSessionsession,String[]args){return"demoSPIcommandresult。";}}创建JDK的spi定义文件在resources/META-INF/services目录下创建com.mz.jarboot.api.cmd.spi.CommandProcessor文件,内容为班级。publicclassDemoApplication{publicstaticvoidmain(String[]args){//dosomethingtry{//NotifycompletionJarbootFactory.createAgentService().setStarted();}catch(Exceptione){log(e.getMessage());}}}