Jarboot is a platform for starting, stopping, managing, and diagnosing Java processes, which can manage, guard, monitor, and diagnose local and remote Java processes.
In the test environment and the integration environment built daily, you can put a series of compilation output and other jar files into the agreed directory, and Jarboot provides a friendly browser UI interface and http interface, and uniformly manages its start, stop and status monitoring, and executes commands to debug the target process.
Technical background and objectives
Jarboot uses Java Agent and ASM technology to inject code into the target Java process, which is non-intrusive, and the injected code is only used to interact with Jarboot services to implement commands, and some commands will modify the bytecode of the class for class enhancement, and add a command system similar to Arthas, such as obtaining JVM information, monitoring thread status, obtaining thread stack information, etc.
Browser interface management, one-click start and stop the service process, no need to manually execute one by one
Supports start-up and stop-priority configuration, and starts in parallel by default
Support process daemon, which will automatically start and notify if the service exits abnormally after it is enabled
Support file update monitoring, and automatically restart if the jar file is updated after it is enabled
- Debugging command execution, remote debugging of multiple Java processes at the same time, more user-friendly interface
Introduction to the Architecture
Module relationships
Sequence diagrams
Install or compile the build
Use Docker
sudo docker run -itd –name jarboot -p 9899:9899 mazheng0908/jarboot
Steps to compile the source code
Ignore this step when using a tarball package or Docker installation
Compile the Jarboot source code
#Compile the front end first.
$ cd jarboot-ui
#You need to install dependencies first., run yarn or npm install
$ yarn
#Execute compilation, yarn build or npm run build, yarn start or npm run start can be executed in development mode
$ yarn build
#Switch to the code root directory. Compile Java code
$ cd .. /
$ mvn clean install
Start the Jarboot service
#carry out startup.sh Boot and use the startup.cmd on your Windows system.
$ sh startup.sh
Enter the login page, the initial username: jarboot, and the default password: jarboot
SpringBoot application
Introduced spring-boot-starter-jarboot dependency
<dependency>
<groupId>io.github.majianzheng</groupId>
<artifactId>spring-boot-starter-jarboot</artifactId>
<version>${jarboot.version}</version>
</dependency>
Implement the CommandProcessorSPI interface
Similarly, you can use the @Bean annotation on a method to define a command handler.
If no @Name annotation is used, the name of the bean will be used as the name of the command by default.
@Name(“spring.command.name”)
@Summary(“The command summary”)
@Description(“The command usage detail”)
@Component
public class DemoServiceImpl implements DemoService, CommandProcessor {
@Override
public String process(CommandSession session, String[] args) {
return “Spring boot Demo user-defined command using Spring SPI”;
}
//implement other method…
}
When introduced
spring-boot-starter-jarboot dependency, two Spring debugging commands, spring.bean and spring.env, will be added
#spring.bean Usage:
$ spring.bean [-b <name>] [-d]
#example
# Get all bean names
$ spring.bean
# Get the bean information
$ spring.bean -b beanName
# Get the details of the bean
$ spring.bean -b beanName -d
#sping.env Usage:
$ spring.env <name>
#example
$ spring.env spring.application.name
How to create a user-defined command
Introduce dependencies on the jarboot API
<dependency>
<groupId>io.github.majianzheng</groupId>
<artifactId>jarboot-api</artifactId>
<scope>provided</scope>
<version>${jarboot.version}</version>
</dependency>
Implement the SPI interface
/**
* Use the Name annotation to define the name of a command
*/
@Name(“demo”)
@Summary(“The command summary”)
@Description(“The command usage detail”)
public class DemoCommandProcessor implements CommandProcessor {
@Override
public String process(CommandSession session, String[] args) {
return “demo SPI command result.”;
}
}
Create an SPI definition file for the JDK
Create a file named com.mz.jarboot.api.cmd.spi.CommandProcessor in the resources/META-INF/services directory with the full name of the class.
public class DemoApplication {
public static void main(String[] args) {
// do something
try {
//Notify completion
JarbootFactory.createAgentService().setStarted();
} catch (Exception e) {
log(e.getMessage());
}
}
}