《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的Jarboot是一个Java进程启停、管理、诊断的平台,可以管理、守护、监控及诊断本地和远程的Java进程。 在测试环境、每日构建的集成环境,可以把一系列编译输出等jar文件放入约定的目录,由Jarboot提供友好的浏览器ui界面和http接口,统一管理它的启动、停止及状态的监控,以及执行命令对目标进程进行调试。 技术背景及目标 Jarboot使用JavaAgent和ASM技术往目标Java进程注入代码,无业务侵入性,注入的代码仅用于和Jarboot的服务实现命令交互,部分命令会修改类的字节码用于类增强,加入了与Arthas类似的命令系统,如获取JVM信息、监控线程状态、获取线程栈信息等。浏览器界面管理,一键启、停服务进程,不必挨个手动执行支持启动、停止优先级配置,默认并行启动支持进程守护,开启后若服务异常退出则自动启动并通知支持文件更新监控,开启后若jar文件更新则自动重启调试命令执行,同时远程调试多个Java进程,界面更友好 架构简介 模块关系 序列图安装或编译构建 使用Dockersudodockerrunitdnamejarbootp9899:9899mazheng0908jarboot 编译源码的步骤 使用压缩包安装或者Docker的时候忽略此步骤 编译Jarboot源代码首先编译前端cdjarbootui首次时需要先安装依赖,执行yarn或npminstallyarn执行编译,yarnbuild或npmrunbuild,开发模式可执行yarnstart或npmrunstartyarnbuild切换到代码根目录,编译Java代码cd。。mvncleaninstall 启动Jarboot服务执行startup。sh启动,在Windows系统上使用startup。cmd。shstartup。sh 进入登录界面,初始的用户名:jarboot,默认密码:jarboot SpringBoot应用引入springbootstarterjarboot依赖dependencygroupIdio。github。majianzhenggroupIdspringbootstarterjarbootartifactIdversion{jarboot。version}versiondependency实现CommandProcessorSPI接口 同样的,你也可以在方法上使用Bean注解来定义命令处理器。 如果没有使用Name注解的话,将会默认使用Bean的名称作为命令的名称。Name(spring。command。name)Summary(Thecommandsummary)Description(Thecommandusagedetail)ComponentpublicclassDemoServiceImplimplementsDemoService,CommandProcessor{OverridepublicStringprocess(CommandSessionsession,String〔〕args){returnSpringbootDemouserdefinedcommandusingSpringSPI;}implementothermethod。。。} 当引入了springbootstarterjarboot依赖后,将会增加2个Spring调试命令,spring。bean和spring。envspring。bean用法:spring。bean〔bname〕〔d〕示例:获取所有的beannamespring。bean获取bean的信息spring。beanbbeanName获取bean的详细信息spring。beanbbeanNamedsping。env用法:spring。envname示例:spring。envspring。application。name如何创建一个用户自定义的命令引入jarbootapi的依赖dependencygroupIdio。github。majianzhenggroupIdjarbootapiartifactIdscopeprovidedscopeversion{jarboot。version}versiondependency实现spi接口使用Name注解来定义一个命令的名字Name(demo)Summary(Thecommandsummary)Description(Thecommandusagedetail)publicclassDemoCommandProcessorimplementsCommandProcessor{OverridepublicStringprocess(CommandSessionsession,String〔〕args){returndemoSPIcommandresult。;}}创建JDK的spi定义文件 在目录resourcesMETAINFservices中创建名为com。mz。jarboot。api。cmd。spi。CommandProcessor的文件,内容为类的全名。publicclassDemoApplication{publicstaticvoidmain(String〔〕args){dosomethingtry{NotifycompletionJarbootFactory。createAgentService()。setStarted();}catch(Exceptione){log(e。getMessage());}}} 更多内容:https:gitee。commajz0908jarboot