我正在尝试开发一个javaagent,它可以在asm-4的帮助下插入代码。现在我遇到了一个非常基本的问题,javaagent的类加载器看不到asm依赖项,因此失败了。我是否必须提供一个带有依赖项的jar(也称为maven build plugin),其中包含代理所需的所有类,或者是否有其他方法可以将类添加到java代理?在类路径中直接引用jar asm-all.jar没有任何帮助。一开始,构建带有依赖关系的jar并没有什么帮助,因为Premain-Class属性不能用组装插件来设置。感谢您的帮助;-)
发布于 2013-04-09 04:16:08
好的,通过实验找到了它。依赖类应该是jar的一部分,jar可以由maven汇编插件创建,例如:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<index>true</index>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
<manifestEntries>
<Premain-Class>test.agent.MyAgent</Premain-Class>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- this is used for inheritance merges -->
<phase>package</phase>
<!-- append to the packaging phase. -->
<goals>
<goal>single</goal>
<!-- goals == mojos -->
</goals>
</execution>
</executions>
</plugin>使用jar作为javaagent路径,一切都会正常工作。
发布于 2016-03-19 21:21:58
我关注了这个blog post。这是我是如何工作的,以获得对象的大小。
/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中(请注意,我们引用自定义清单)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>
MANIFEST.MF
</manifestFile>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>
ar.com.docdigital.App
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>My Instrumentation Agent:
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输出放在一起(&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发布于 2018-09-01 00:23:05
我的CustomAgent使用了maven-jar-plugin。我没有任何依赖的模块/jars,所以使用组装插件是一种过度的杀伤力。
<build>
<sourceDirectory>src</sourceDirectory>
<finalName>are-agent</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
<manifestEntries>
<Premain-Class>are.agent.CustomAgent</Premain-Class>
<Can-Redefine-Classes>false</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
<build>https://stackoverflow.com/questions/15872642
复制相似问题