Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NoClassDefFoundError当通过sun.reflect.NativeConstructorAccessorImpl.newInstance0调用通过检测插入的方法调用时_Java_Logging_Bytecode_Instrumentation_Java Bytecode Asm - Fatal编程技术网

Java NoClassDefFoundError当通过sun.reflect.NativeConstructorAccessorImpl.newInstance0调用通过检测插入的方法调用时

Java NoClassDefFoundError当通过sun.reflect.NativeConstructorAccessorImpl.newInstance0调用通过检测插入的方法调用时,java,logging,bytecode,instrumentation,java-bytecode-asm,Java,Logging,Bytecode,Instrumentation,Java Bytecode Asm,我已经使用ASM创建了一个JavaAgent,它在正在加载的类的特定区域插入方法调用(INVOKESTATIC org/test/Logger/Log)。 插入的方法调用(org/test/Logger/Log)在JavaAgent本身中声明 这在正常情况下起作用,并调用插入的方法调用 我在JBOSS中配置了这个代理并启动了服务器。代理被正确注册,并且org/test/Logger/Log方法被多次调用 但最终它崩溃了,出现了一个NoClassDefFoundError: 线程“main”jav

我已经使用ASM创建了一个JavaAgent,它在正在加载的类的特定区域插入方法调用(INVOKESTATIC org/test/Logger/Log)。 插入的方法调用(org/test/Logger/Log)在JavaAgent本身中声明

这在正常情况下起作用,并调用插入的方法调用

我在JBOSS中配置了这个代理并启动了服务器。代理被正确注册,并且org/test/Logger/Log方法被多次调用

但最终它崩溃了,出现了一个NoClassDefFoundError:

线程“main”java.lang.NoClassDefFoundError中出现异常:org/test/Logger/Log 位于org.apache.xerces.jaxp.saxparserfactorympl。(未知源) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:513) 位于java.lang.Class.newInstance0(Class.java:355) 位于java.lang.Class.newInstance(Class.java:308) 位于javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:147) 位于javax.xml.parsers.FactoryFinder.findJarServiceProvider(FactoryFinder.java:298) 位于javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:223) 位于javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:128) 位于org.jboss.xb.binding.parser.sax.SaxJBossXBParser(SaxJBossXBParser.java:54) 位于org.jboss.xb.binding.UnmarshallerImpl.(UnmarshallerImpl.java:56) 位于org.jboss.xb.binding.UnmarshallerFactory$UnmarshallerFactoryImpl.newUnmarshaller(UnmarshallerFactory.java:96) 位于org.jboss.bootstrap.xml.bootstraparser.parse(bootstraparser.java:50) 位于org.jboss.bootstrap.microcontainer.ServerImpl.doStart(ServerImpl.java:123) 位于org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:450) 位于org.jboss.Main.boot(Main.java:221) 位于org.jboss.Main$1.run(Main.java:556) 运行(Thread.java:662)

我猜是因为org.apache.xerces.jaxp.saxparserfactorympl.方法是通过sun.reflect调用的,它可能使用了不同的类加载器,并且它的路径中没有我的javaagent


这里可能出了什么问题?我如何从javaagent本身内部解决这个问题?我希望尽可能轻松地使用此代理,而无需用户进行太多配置。

Java代理始终由系统类加载器加载,该加载器在类路径上查找其资源。您需要将记录器添加到类路径

运行应用程序服务器时,应用程序不是由系统类加载器加载的,而是由特定于正在运行的应用程序的类加载器加载的。此时,记录器对系统类加载器不可用

您需要将插入指令的类使用的所有文件包含到代理jar中,并从类path类访问数据。请注意,应用程序服务器通常实现子类装入器。如果将记录器类同时添加到代理和应用程序中,则实际上将访问两个不同的记录器类

通常,在一个Maven项目中,您将在一个单独的模块中创建代理jar,并在实际应用程序中包含所提供范围内的记录器