200316-IDEA + experta en proyectos de base cero al agente de construcción Java
Agente de Java (Java sonda) Aunque no existe, pero para la gran mayoría de javaer desarrollo de negocios, esto es bastante mágico y extraño después jdk1.5, aunque en el desarrollo de negocio real, rara vez se involucran el agente de desarrollo, pero cada uno desarrolladores de Java han utilizado, como el uso de la idea de escribir un HelloWorld.java, y ejecutarlo, una mirada más cercana a la salida de la consola
Este artículo trata de principiantes como agente de Java, y le enseñó cómo desarrollar un método estadístico que consume tiempo agente de Java
I. Desarrollo de Java Agent
En primer lugar limpiar nuestro entorno de desarrollo, seleccione IDEA como editor, maven para la gestión de paquetes
1. Lógica Central
Crear un nuevo proyecto (o sub-módulo), entonces se crea una nueva clase SimpleAgent
public class SimpleAgent {
/**
* jvm 参数形式启动,运行此方法
*
* @param agentArgs
* @param inst
*/
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("premain");
}
/**
* 动态 attach 方式启动,运行此方法
*
* @param agentArgs
* @param inst
*/
public static void agentmain(String agentArgs, Instrumentation inst) {
System.out.println("agentmain");
}
}
复制代码
Vamos a ignorar lo anterior dos métodos de específico que desempeñan un rápido vistazo a la diferencia entre estos dos métodos, los comentarios también dicen
- parámetros de JVM formulario: método premain Call
- adjuntar maneras: Método agentmain Call
¿Qué camino JVM, que es el uso de la aplicación de destino de este agente, en el arranque, es necesario especificar los parámetros de JVM -javaagent:xxx.jar
, cuando proporcionamos agente pertenece a los servicios básicos esenciales se pueden utilizar de esta manera
Cuando se inicia la aplicación de destino, y no añadió -javaagent
cargar nuestro agente, todavía quiere el programa de destino con nuestro agente, esta vez podemos utilizar adjuntar formas de uso (estará de nuevo en el uso de posturas específicas), como es natural pensar si nuestra agente de dirección para depurar el problema, de esta manera puede ser
2. paquete
Por encima de un simple SimpleAgent poner nuestra funcionalidad básica del Agente terminado (es así de simple), es necesario hacer un paquete Jar
Por Maven plugin, puede emitir una relativamente simple paquete de agentes de cumplimiento de Java, hay dos gestos de uso común
a. configuración pom especificado
En el archivo pom.xml, agregue la siguiente configuración, tenga en cuenta los manifestEntries
parámetros de la etiqueta
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifestEntries>
<Premain-Class>com.git.hui.agent.SimpleAgent</Premain-Class>
<Agent-Class>com.git.hui.agent.SimpleAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<goals>
<goal>attached</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
复制代码
A continuación, por mvn assembly:assembly
orden empaquetado en target
el directorio, se puede ver un sufijo jar-with-dependencies
paquete frasco, ese es nuestro objetivo
b. perfil MANIFEST.MF
A través del archivo de configuración MANIFEST.MF
, pueden ser más comunes, también hay una postura uso breve
- En el directorio de recursos (Recursos), el nuevo directorio
META-INF
- En el
META-INF
directorio, cree un nuevo archivoMANIFEST.MF
El documento dice lo siguiente
Manifest-Version: 1.0
Premain-Class: com.git.hui.agent.SimpleAgent
Agent-Class: com.git.hui.agent.SimpleAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
复制代码
Tenga en cuenta que el último de una línea en blanco (si no muestran por encima de ella, en su mayoría de rebajas render un problema), no menos, en la idea, cuando se elimina la última línea, se han producido errores recuerdan
Entonces nuestra pom.xml
configuración, tenemos que hacer los cambios correspondientes
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifestFile>
src/main/resources/META-INF/MANIFEST.MF
</manifestFile>
<!--<manifestEntries>-->
<!--<Premain-Class>com.git.hui.agent.SimpleAgent</Premain-Class>-->
<!--<Agent-Class>com.git.hui.agent.SimpleAgent</Agent-Class>-->
<!--<Can-Redefine-Classes>true</Can-Redefine-Classes>-->
<!--<Can-Retransform-Classes>true</Can-Retransform-Classes>-->
<!--</manifestEntries>-->
</archive>
</configuration>
<executions>
<execution>
<goals>
<goal>attached</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
复制代码
También por mvn assembly:assembly
el embalaje de comandos
II. Agente de Uso
Con el agente, el siguiente paso es la necesidad de probar el uso de uso del agente de los dos métodos propuestos anteriores se describen por separado más adelante nos
1. Parámetros JVM
En primer lugar crear un proyecto de demostración, escribir una clase simple prueba
public class BaseMain {
public int print(int i) {
System.out.println("i: " + i);
return i + 2;
}
public void run() {
int i = 1;
while (true) {
i = print(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
BaseMain main = new BaseMain();
main.run();
Thread.sleep(1000 * 60 * 60);
}
}
复制代码
clase de prueba, hay un bucle infinito, cada 1s llamada sobre el método de impresión, cuando se prueba IDEA, puede configurar directamente la clase, añadiendo parámetros de JVM, de la siguiente manera
Tenga en cuenta que el contenido está por encima de la caja roja en una dirección absoluta lleno del agente: -javaagent:/Users/..../target/java-agent-1.0-SNAPSHOT-jar-with-dependencies.jar
Después de ejecutar el método principal, verá la salida de la consola
Tenga en cuenta que lo anterior premain
, esta es nuestra principal SimpleAgent
de la premain
salida de métodos, y la salida de una sola vez
2. Modo de adjuntar
Cuando se utiliza el modo de adjuntar, puede simplemente quieren ser entendidos como nuestro agente se inyecta en la aplicación de destino, por lo que tenemos que poseer un programa para hacer esto
public class AttachMain {
public static void main(String[] args)
throws IOException, AgentLoadException, AgentInitializationException, AttachNotSupportedException {
// attach方法参数为目标应用程序的进程号
VirtualMachine vm = VirtualMachine.attach("36633");
// 请用你自己的agent绝对地址,替换这个
vm.loadAgent("/Users/......./target/java-agent-1.0-SNAPSHOT-jar-with-dependencies.jar");
}
}
复制代码
La lógica anterior es relativamente simple, primero por jps -l
la adquisición de ID de proceso de la aplicación de destino
Cuando haya terminado anteriormente, el método principal, la salida de registro de la consola dos líneas similar al siguiente, puede ser entendido simplemente como conecto a la aplicación de destino, y perdió un agente, a continuación, una voluta de nube no quedarse sin permiso la
Connected to the target VM, address: '127.0.0.1:63710', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:63710', transport: 'socket'
复制代码
A continuación, vamos a ver la salida BaseMain anteriormente, la línea intercalada agentmain
, para demostrar que el agente se inyectó con éxito en ella
3. Resumen
En este artículo se describe The Maven + medio ambiente bajo la idea, que enseña cómo desarrollar un mundo JavaAgent versión hola y todo el proceso de embalaje
dos métodos
método | explicación | Usar gestos |
---|---|---|
premain() |
Se llama cuando manera JVM para cargar el agente, es decir la aplicación de destino en el inicio, agente designado | -javaagent:xxx.jar |
agentmain() |
el modo de llamada cuando se ejecuta en adjuntar agente, utilizando funciona la aplicación de destino | VirtualMachine.attach(pid) Para especificar el ID de proceso de destino vm.loadAgent("...jar") agente de carga |
Hay dos tipos de postura envasados
Cuando empaquetado como agente java parámetros de configuración disponibles hay que señalar que, siempre que el anterior dos métodos, uno es directamente en la pom.xml
configuración especificada
<manifestEntries>
<Premain-Class>com.git.hui.agent.SimpleAgent</Premain-Class>
<Agent-Class>com.git.hui.agent.SimpleAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
复制代码
Otro archivo de configuración está META-INF/MANIFEST.MF
escrito en (Tenga en cuenta que la última línea integral en blanco)
Manifest-Version: 1.0
Premain-Class: com.git.hui.agent.SimpleAgent
Agent-Class: com.git.hui.agent.SimpleAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
复制代码
Por supuesto, después de leer En esta parte, se encuentra el desarrollo real de agente de Java todavía no está clara, no dan salida a una línea delante del agente es hello world
para escapar, y se imagina que esto es completamente diferente ah
Siguiente post va a ser enseñado cómo lograr un paquete de agentes de java que consume tiempo estadística se describirá en detalle utilizando la interfaz Instrumentation
para implementar la modificación de código de bytes, con el fin de lograr una mayor
II. Otro
0. Fuente
1. un blog gris : liuyueyi.github.io/hexblog
Un blog personal gris, grabación de todos los estudios y el trabajo en el blog, la bienvenida a circundar
2. Declaración
Creen que todo el libro no es tan bueno, por encima, es puramente una de las palabras, debido a la capacidad personal limitado, es omisiones y errores inevitables, tales como encontrar un fallo, o tienen mejores sugerencias son bienvenidos críticas y generoso agradecimiento
- Microblogging Dirección: poco gris Blog
- QQ: un gris / 3302797840
3. preocupación Scan
Un blog gris