【发布时间】:2018-02-09 01:17:53
【问题描述】:
我的代理类
package com.mytransformers;
import java.lang.instrument.Instrumentation;
public class MyTransformerAgent {
public static void premain(String args, Instrumentation inst) {
MyTransformer transformer = new MyTransformer();
inst.addTransformer(transformer);
}
}
我的变压器:
public class MyTransformer implements ClassFileTransformer{
public byte[] transform(ClassLoader arg0, String arg1, Class<?> arg2, ProtectionDomain arg3, byte[] arg4)
throws IllegalClassFormatException {
// processing to return some bytes/null;
}
我使用 maven POM 构建了我的清单,我可以确认我的 jar 在 META-INF 中有以下清单
Manifest-Version: 1.0
Premain-Class: com.mytransformers.MyTransformerAgent
Archiver-Version: Plexus Archiver
Built-By: ha9u63@r
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Class-Path: C:/apache-tomcat-8.5.16/bin/tomcat-juli.jar
Can-Set-Native-Method-Prefix: true
Created-By: Apache Maven 3.0.5
Build-Jdk: 1.8.0_141
Boot-Class-Path: C:/apache-tomcat-8.5.16/lib/tomcat-coyote.jar
我将我的应用程序 jar(简单的 Hello World 1 行语句)和代理 jar 复制到同一个文件夹中并运行以下命令:
java -javaagent:myagent.jar -jar myapp.jar
而且我不断收到以下错误:
Exception in thread "main" java.lang.ClassNotFoundException: com.mytransformers.MyTransformerAgent
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Source)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown Source)
FATAL ERROR in native method: processing of -javaagent failed
这里还缺少什么?我有点困惑。是否有一些我破坏的类加载委托?
问候,
【问题讨论】:
-
您是否确认代理类在 jar 文件中,在正确的目录中?你的转换器真的对tomcat有依赖吗?
-
是的,它有并且类在那里我使用 javap 验证我什至尝试不使用包,即 jar 中的纯类。没有运气
-
尝试使用 Java 9 运行。iirc,当类查找由于其他依赖关系而失败时,它会提供更详细的信息,因此也许您可以从该测试中获得有用的信息。
标签: java instrumentation