我试图建立一个javaagent即会与ASM-4帮助工具的代码。 现在我stucked有一个非常基本的问题,对于javaagent的类装载器并不见ASM依赖性和为此失败。 我必须提供一个jar-与依赖性(又名Maven构建插件),它包含所有需要的类代理,或者是有另一种方式类添加到Java代理? 直接在classpath中引用的jar ASM-all.jar在没有帮助。 构建JAR-有依赖性并没有在第一帮助,因为倍美力-Class属性无法组装插件进行设置。 帮助表示赞赏;-)
Answer 1:
好吧,发现通过实验。 从属类应该是罐子,其可以通过行家组件的插件来创建,例如部分:
<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>
使用的水瓶中javaagent路径,一切工作正常。
Answer 2:
我跟着这个博客帖子 。 这是我如何做它的工作,获得对象的大小。
/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>
我的仪器代理:
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);
}
}
我的主要应用程序:
包Arkcomkdochdigitl;
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
Answer 3:
我想你可以在MyAgent.jar MANIFEST.MF文件指定类路径。
Answer 4:
您应该添加倍美力级条目清单。 我使用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
模式细节
Answer 5:
我用的maven-JAR-插件我CustomAgent。 我没有任何从属模块/所以使用组装插件罐子是矫枉过正。
<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>
文章来源: How to put classes for javaagent in the classpath