如何在类路径中放置javaagent的类

我正在尝试开发一个javaagent,它可以在asm-4的帮助下编写代码。 现在我遇到了一个非常基本的问题,javaagent的类加载器没有看到asm依赖,因此失败了。 我是否必须提供一个jar-with-dependencies(又名maven build plugin),其中包含代理程序所需的所有类,或者是否有另一种方法将类添加到java代理程序中? 直接在类路径中引用jar asm-all.jar没有帮助。 构建jar-with-dependencies最初没有帮助,因为无法使用程序集插件设置Premain-Class属性。 感谢帮助;-)

好的,通过实验找到它。 依赖类应该是jar的一部分,可以通过maven程序集插件创建,例如:

 maven-assembly-plugin 2.2   jar-with-dependencies   true  true true   test.agent.MyAgent      make-assembly  package   single      

使用jar作为javaagent路径,一切正常。

我关注这篇博文 。 这是我如何使其工作,以获得对象的大小。

/MANIFEST.MF

 Manifest-Version: 1.0 Premain-Class: ar.com.docdigital.InstrumentationApp Can-Redefine-Classes: true Can-Retransform-Classes: true Can-Set-Native-Method-Prefix: true 

在你的pom.xml中(注意我们引用自定义MANIFEST)

  org.apache.maven.plugins maven-jar-plugin    MANIFEST.MF   true  ar.com.docdigital.App      

我的仪器代理商:

 package ar.com.docdigital; import java.lang.instrument.Instrumentation; /** * * @author juan.fernandez */ public class InstrumentationApp { private static Instrumentation instrumentation; public static void premain(String args, Instrumentation inst) { instrumentation = inst; } public static long getObjectSize(Object o) { return instrumentation.getObjectSize(o); } } 

我的主要应用:

包ar.com.docdigital;

 import static ar.com.docdigital.InstrumentationApp.getObjectSize; /** * * @author juan.fernandez */ public class App { public static void main (String[] args) { System.out.println("Size of CoprimeLong: " + getObjectSize(new CoprimesList.CoprimeLong(1L))); System.out.println("Size of Long: " + getObjectSize(new Long(1L))); } } 

全部放在一起和CLI输出:

 $ mvn package $ java -javaagent:target/primos-0.1.0-SNAPSHOT.jar -jar target/primos-0.1.0-SNAPSHOT.jar Size of CoprimeLong: 24 Size of Long: 24 

我认为您可以在MyAgent.jar中的Manifest.mf文件中指定Class-Path。

您应该将Premain-Class条目添加到清单中。 我使用gradle来构建Java项目。

将其添加到gradle.build

 jar { manifest { attributes( "Premain-Class": "com.training.agent.agentapp.SimplestAgent", "Can-Redefine-Classes": false, "Can-Set-Native-Method-Prefix": false ) } } 

然后你可以运行它

 java -javaagent:agent.jar -jar application.jar 

模式细节

我为我的CustomAgent使用了maven-jar-plugin。 我没有任何依赖模块/ jar,所以使用程序集插件是一种矫枉过正。

  src are-agent   org.apache.maven.plugins maven-jar-plugin 2.4    true true true   are.agent.CustomAgent false true