用javassist加载另一个类
我有两个项目:一个探查器和一个基本应用程序(带有JUnit测试) 探查器使用Javassist为基本应用程序提供工具 当探查器位于基本应用程序内部时,它可以正常工作。 当探查器位于基本应用程序之外时,我必须将基本应用程序jar文件导入Eclipse上的构建路径中,以简化我的应用程序 我想像EMMA那样在命令行中的基本应用程序上运行探查器: java-jar profiler.jar运行application.jar 但我不知道如何告诉我的分析器,好的,给这个罐子装上仪器 以下是我的探查器主代码:用javassist加载另一个类,java,classloader,emma,javassist,Java,Classloader,Emma,Javassist,我有两个项目:一个探查器和一个基本应用程序(带有JUnit测试) 探查器使用Javassist为基本应用程序提供工具 当探查器位于基本应用程序内部时,它可以正常工作。 当探查器位于基本应用程序之外时,我必须将基本应用程序jar文件导入Eclipse上的构建路径中,以简化我的应用程序 我想像EMMA那样在命令行中的基本应用程序上运行探查器: java-jar profiler.jar运行application.jar 但我不知道如何告诉我的分析器,好的,给这个罐子装上仪器 以下是我的探查器主代码:
public static void main(String[] args) throws Exception {
Loader loader = new Loader();
loader.addTranslator(ClassPool.getDefault(), new Profiler());
try {
loader.run("com.application.bookstore.test.Test", null);
} catch (Throwable e) {
e.printStackTrace();
}
}
我试着这么做:
final String arg = args[0];
final String[] commandArgs = new String[args.length - 1];
System.arraycopy(args, 1, commandArgs, 0, commandArgs.length-1);
loader.run(arg, commandArgs);
但当我运行它时,我得到:
[kdelemme@pdkdelemme build]$ java -jar profiler.jar bookstore.jar
java.lang.ClassNotFoundException: bookstore.jar
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at javassist.Loader.delegateToParent(Loader.java:429)
at javassist.Loader.loadClass(Loader.java:315)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at javassist.Loader.run(Loader.java:289)
at com.modeln.Profiler.main(Profiler.java:93)
因此,我尝试直接运行到我的主类目录:
[kdelemme@pdkdelemme test]$ ls
profiler.jar Test.class
[kdelemme@pdkdelemme test]$ java -jar profiler.jar Test
java.lang.NoClassDefFoundError: Test (wrong name: com/application/bookstore/test/Test)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.lang.ClassLoader.defineClass(ClassLoader.java:480)
at javassist.Loader.findClass(Loader.java:380)
at javassist.Loader.loadClass(Loader.java:312)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at javassist.Loader.run(Loader.java:289)
at com.modeln.Profiler.main(Profiler.java:93)
那么,您对如何在外部jar项目上运行我的分析器有什么想法吗?非常感谢 好的,解决方案是:只需pool.insertClassPath()
publicstaticvoidmain(字符串[]args)引发异常{
加载器=新加载器();
addTranslator(ClassPool.getDefault(),new Profiler());
试一试{
如果(参数长度<1){
系统输出打印LN(工具使用);
}否则{
//使用config/config.properties文件初始化探查器
初始化profiler();
final String[]commandArgs=新字符串[args.length-1];
数组复制(args,1,commandArgs,0,commandArgs.length);
//打开一个jar文件,将其解压缩到/tmp/中,然后将/tmp/classpath添加到javassist文件中
File File=新文件(args[0]);
JarFile JarFile=新的JarFile(args[0]);
Manifest Manifest=jarFile.getManifest();
字符串mainClassName=null;
if(manifest!=null){
mainClassName=manifest.getMainAttributes().getValue(“主类”);
}
jarFile.close();
mainClassName=mainClassName.replaceAll(“/”,“);
//默认的临时目录是Jarfilename,不带.jar
最终文件workDir=File.createTempFile(args[0]。子字符串(0,args[0]。indexOf('.'),“”);
workDir.delete();
workDir.mkdirs();
//将所有文件取消归档到WorkDir临时目录中
unJar(文件,workDir);
//将所有目录添加到类路径中
创建类路径(workDir,文件);
//将包含unJar文件的类路径添加到Javassist类池中
ClassPool=ClassPool.getDefault();
pool.insertClassPath(workDir+“/”);
loader.run(mainClassName,null);
}
}捕获(可丢弃的e){
e、 printStackTrace();
}
System.out.println(“插入“+args[0]+”完成”);
}
好的,解决方案如下:只需pool.insertClassPath()
publicstaticvoidmain(字符串[]args)引发异常{
加载器=新加载器();
addTranslator(ClassPool.getDefault(),new Profiler());
试一试{
如果(参数长度<1){
系统输出打印LN(工具使用);
}否则{
//使用config/config.properties文件初始化探查器
初始化profiler();
final String[]commandArgs=新字符串[args.length-1];
数组复制(args,1,commandArgs,0,commandArgs.length);
//打开一个jar文件,将其解压缩到/tmp/中,然后将/tmp/classpath添加到javassist文件中
File File=新文件(args[0]);
JarFile JarFile=新的JarFile(args[0]);
Manifest Manifest=jarFile.getManifest();
字符串mainClassName=null;
if(manifest!=null){
mainClassName=manifest.getMainAttributes().getValue(“主类”);
}
jarFile.close();
mainClassName=mainClassName.replaceAll(“/”,“);
//默认的临时目录是Jarfilename,不带.jar
最终文件workDir=File.createTempFile(args[0]。子字符串(0,args[0]。indexOf('.'),“”);
workDir.delete();
workDir.mkdirs();
//将所有文件取消归档到WorkDir临时目录中
unJar(文件,workDir);
//将所有目录添加到类路径中
创建类路径(workDir,文件);
//将包含unJar文件的类路径添加到Javassist类池中
ClassPool=ClassPool.getDefault();
pool.insertClassPath(workDir+“/”);
loader.run(mainClassName,null);
}
}捕获(可丢弃的e){
e、 printStackTrace();
}
System.out.println(“插入“+args[0]+”完成”);
}
public static void main(String[] args) throws Exception {
Loader loader = new Loader();
loader.addTranslator(ClassPool.getDefault(), new Profiler());
try {
if (args.length < 1) {
System.out.println(TOOL_USAGE);
} else {
//Initialize profiler with config/config.properties file
initializeProfiler();
final String[] commandArgs = new String[args.length - 1];
System.arraycopy(args, 1, commandArgs, 0, commandArgs.length);
//Open a jar file, unJar it into /tmp/ then add the /tmp/ classpath to the javassist laoder
File file = new File(args[0]);
JarFile jarFile = new JarFile(args[0]);
Manifest manifest = jarFile.getManifest();
String mainClassName = null;
if (manifest != null) {
mainClassName = manifest.getMainAttributes().getValue("Main-Class");
}
jarFile.close();
mainClassName = mainClassName.replaceAll("/", ".");
//Default temp directory is Jarfilename without .jar
final File workDir = File.createTempFile(args[0].substring(0, args[0].indexOf('.')), "");
workDir.delete();
workDir.mkdirs();
//Unjar all files into WorkDir temp directory
unJar(file, workDir);
//Add all directories into classPath
createClassPath(workDir, file);
//Add the classPath with unJar files into the Javassist ClassPool
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(workDir + "/");
loader.run(mainClassName, null);
}
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("Instrumentation of " + args[0] + " finished.");
}