Javaのエージェントを構築するIDEA + Mavenのゼロベースのプロジェクト

Javaのエージェントを構築するための200316-IDEA + Mavenのゼロベースのプロジェクト

Javaのエージェント(Javaのプローブ)があるが、事業開発javaerの大半のために、この事はJDK1.5後かなり魔法と奇妙ではあるが、実際のビジネスの発展に、めったに関与していないにもかかわらずエージェントの開発は、しかし、それぞれのJava開発者は、このような、コンソール出力を詳しく見てHelloWorld.javaを書き、それを実行するためのアイデアを使用して、使用しています

この記事では、初心者のJavaエージェントとして扱って、そしてどのように統計的な手法を開発する方法を教えて時間を浪費するのJavaエージェントを

I.のJavaエージェントの開発

最初のパケット管理のためにMavenの編集者として、私たちの開発環境、選択IDEAをクリア

1.コアロジック

新しいプロジェクト(またはサブモジュール)を作成し、その後、私たちは、新しいクラスを作成します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");
    }
}
复制代码

コメントも言う、特定の二つの方法あなたはこれらの2つの方法の違いを簡単に見てプレイする上で無視しましょう

  • JVMパラメータは、形成:コールpremainメソッド
  • 方法を添付:コールagentmainメソッド

このエージェントのターゲットアプリケーションを使用することであるJVMの方法は、ブート時に、あなたはJVMパラメータを指定する必要があり-javaagent:xxx.jar、我々は、エージェントを提供する場合、基本的な必要不可欠なサービスに属しているこのような方法で使用することができます

ターゲットアプリケーションが起動され、追加しなかった場合には-javaagent、当社のエージェントをロードし、まだ私たちのエージェントを使用して、ターゲットプログラムをしたい、我々が使用することができます。この時間は、私たちの場合だと思う当然、(特定の姿勢の使用に戻ってくる)を使用する方法を添付しますこのように、問題をデバッグするために、エージェントを標的とすることができます

2.パッケージ

SimpleAgentエージェントの中核機能は(そのシンプルがある)を終了、あなたがジャーパッケージを作成する必要が入れシンプル上記

Mavenのプラグインによって、あなたは、2つの一般的な使用のジェスチャーは、出力比較的単純なコンプライアンスJavaエージェントパッケージがあることができます

。POM指定された設定

pom.xmlファイルでは、次の設定を追加しますので、予めご了承くださいmanifestEntriesタグ内のパラメータを

<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>
复制代码

その後でmvn assembly:assemblyにパッケージコマンドtargetディレクトリには、接尾辞見ることができるjar-with-dependencies当社の目標ですjarファイルパッケージを、

B。MANIFEST.MFプロフィール

コンフィギュレーションファイルを使用してMANIFEST.MF、簡単に使用姿勢もあり、より一般的かもしれ

  • リソースディレクトリ(リソース)では、新しいディレクトリMETA-INF
  • ではMETA-INF、ディレクトリ、新しいファイルを作成しますMANIFEST.MF

次のようにドキュメントを読み込みます

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

复制代码

ノートは空白行の最後にあること、劣らず、アイデアで、あなたは最後の行を削除すると、ありましたミスが思い出させる(私はそれの上に表示されない場合は、ほとんどの問題をレンダリングするマークダウン)してください

そして、私達のpom.xml構成は、我々は、対応する変更を加える必要があります

<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>
复制代码

また、によってmvn assembly:assembly、コマンドの包装

II。エージェントの使用

エージェントと、次のステップは、米国の下に別々に記載されている上記提案の二つの方法の薬剤の使用の使用をテストする必要があります

1. JVMパラメータ

まず、簡単なテストクラスを作成し、デモプロジェクトを作成します

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);
    }
}
复制代码

Testクラス、無限ループは、印刷方法については、各1Sコール、IDEAを試験したとき、次のように、あなたが直接、JVMパラメータを追加し、クラスを設定することができますが、そこにあります

コンテンツは、剤の充填絶対アドレス上の赤いボックスの上にあることに注意してください。 -javaagent:/Users/..../target/java-agent-1.0-SNAPSHOT-jar-with-dependencies.jar

mainメソッドを実行した後、コンソール出力が表示されます

上記のことに注意してくださいpremain、これは私たちのトップでSimpleAgentpremain一度だけのメソッドの出力、および出力

2.モードを添付します

モードを取り付け使用する場合は、当社のエージェントは、ターゲットアプリケーションに注入されたとして、我々はこのことを行うためのプログラムを所有する必要があるので、あなたは単に、理解されるようにしたいことができます

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");
    }
}
复制代码

上記のロジックはによって最初に、比較的簡単であるjps -lターゲット・アプリケーションのプロセスIDを取得します

mainメソッドの上に終了したら、次のようなコンソールログ出力の2行は、単に私がターゲットアプリケーションに接続するものとして理解し、エージェントを失ったことができ、その後、雲のWISPは、任意の休暇を取ることはありませんインクルード

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'
复制代码

次に、上記BaseMain出力、挟まラインでの見てみましょうagentmain、そのエージェントを表示するには成功し、それに注入しました

3.まとめ

この記事では、アイデアの下でのMaven +環境を説明し、どのバージョンのJavaAgentのハロー世界と梱包のプロセス全体を開発する方法を教えて

二つの方法

方法 説明 ジェスチャーを使用してください
premain() JVMの方法は、エージェントをロードするときに呼び出され、それが起動時にターゲットアプリケーションは、指定された薬剤であります -javaagent:xxx.jar
agentmain() 通話モードは、ターゲットアプリケーションの動作を使用して、エージェントを添付して実行しているとき VirtualMachine.attach(pid)ターゲットプロセスIDを指定するには、
vm.loadAgent("...jar")ロード・エージェントを

パッケージ姿勢の二種類

Javaエージェント利用可能な設定パラメータとしてパッケージときに、2つの方法の上方に設けられ、一方は直接であることに留意すべきであるpom.xml指定された構成

<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>
复制代码

別の設定ファイルはされMETA-INF/MANIFEST.MF(注最後の空白の線積分という)で書かれました

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

复制代码

もちろん、この部分で読んだ後、あなたはJavaエージェントの実際の開発はまだ明確ではないでしょう、薬の前に出力行がありませんhello world、それを離れて取得し、これは完全に異なるああです想像します

次の投稿は、あなたがどのように統計的な時間のかかるJavaエージェントパッケージは、インタフェースを用いて詳細に説明する達成するために教えられますInstrumentation強化を達成するためには、バイトコードの変更を実装します

II。その他

0ソース

1. グレーブログliuyueyi.github.io/hexblog

灰色の個人ブログ、ブログ内のすべての研究と仕事を記録し、周りに行くことを歓迎

2.ステートメント

本は良いとして、上記、により制限され、個人能力に、純粋な言葉の一つであるされていない、すべてを信じて、それは避けられない欠落やミス、などのバグを見つけたり、より良い提案を歓迎批判と寛大な感謝されていがあります

3.スキャン懸念

灰色のブログ

QRコード

おすすめ

転載: juejin.im/post/5e6efdbcf265da573d61c010