IDEA + experta en proyectos de base cero al agente de construcción Java

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ó -javaagentcargar 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 manifestEntriespará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:assemblyorden empaquetado en targetel directorio, se puede ver un sufijo jar-with-dependenciespaquete 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 directorioMETA-INF
  • En el META-INFdirectorio, 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.xmlconfiguració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:assemblyel 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 SimpleAgentde la premainsalida 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 -lla 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.xmlconfiguració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.MFescrito 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 worldpara 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 Instrumentationpara 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

3. preocupación Scan

Un blog gris

Código QR

Supongo que te gusta

Origin juejin.im/post/5e6efdbcf265da573d61c010
Recomendado
Clasificación