javaAgent打包找不到premain類文件解決


agent 作用和開發

  • 可以用獨立於應用程序之外的代理(agent)程序來監測和協助運行在JVM上的應用程序。這種監測和協助包括但不限於獲取JVM運行時狀態,替換和修改類定義等。

由此可知agent 功能不局限於監測jvm運行狀態,我們還可以自定義他的功能,用處就自己想吧,比如 日志標簽, 接口鏈路追蹤, jvm信息, aop相關操作,服務器相關信息,接口訪問前的監測,項目運行環境安裝(配合腳本) 等一系列操作

agent 打包失敗解決方案

作為新手 ,第一次實踐一般都是根據網上的教程來的,於是我也是這樣的,

  • 生成一個META-INF/MAINIFEST.MF文件
  • 重寫一個premain方法
  • 在MAINIFEST.MF文件里面配置上必須的參數
       Manifest-Version: 1.0
       Premain-Class: UtilsAgent
       Created-By: 1.6.0_06
  • 打包 運行 測試 紅一片,找不到的premain方法和類
    !!! 就很慘就很難受

於是研究一番,發現這些操作的最終目的就是吧上面配置文件里面的這個 Premain-Class 東西放進去,萬變不離其蹤
於是我用maven試類一下,果然可行,一下是正確的配置方式,用於記錄踩坑經驗

 <build>
    <finalName>utils-agent</finalName>
    <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
            <archive>
                <!--自動添加META-INF/MANIFEST.MF -->
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
                <manifestEntries>
                    <Premain-Class>vip.setsun.agent.UtilsAgent</Premain-Class>
                    <Agent-Class>vip.setsun.agent.UtilsAgent</Agent-Class>
                    <Can-Redefine-Classes>true</Can-Redefine-Classes>
                    <Can-Retransform-Classes>true</Can-Retransform-Classes>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>6</source>
                <target>6</target>
            </configuration>
        </plugin>
    </plugins>
    </build>

premain 方法

       public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("agentArgs : " + agentArgs);
        inst.addTransformer(new DefineTransformer());
    }

    static class DefineTransformer implements ClassFileTransformer {
        @Override
        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            System.out.println("premain load Class:" + className);
            System.out.println("premain loader:" + loader.toString());

            System.out.println("這里可以根據的自己的需求拿到想要的東西,比如 請求參數 相應參數 等。。。");


            return classfileBuffer;
        }
    }

demo案例

  • 將上面的兩段代碼打包就行了
  • 然后運行 idea 需要在vm options 配置 -javaagent:${your.path}/utils-agent.jar
  • 或者直接運行jar. java -javaagent:${your.path}/utils-agent.jar -jar test.jar
  • 訪問main方法或者springboot接口即可看到相關日志


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM