2015-07-22 4 views
1

Я создал с помощью ASM JavaAgent, который вставляет вызовы методов (INVOKESTATIC орга/тест/Logger/Журнал) на конкретную области в классе загружается. Введенные вызовы методов (org/test/Logger/Log) объявлены в самом JavaAgent.NoClassDefFoundError, когда вызов методы вставляется с помощью измерительных приборов вызываются через sun.reflect.NativeConstructorAccessorImpl.newInstance0

Это работает при нормальных обстоятельствах и вызываются вызовы вставленных методов.

Я настроил этот агент в JBOSS и запустил сервер. Агент регистрируется правильно, и метод org/test/Logger/Log вызывается несколько раз.

Но в конце концов падает с NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: org/test/Logger/Log at org.apache.xerces.jaxp.SAXParserFactoryImpl.(Unknown Source) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:147) at javax.xml.parsers.FactoryFinder.findJarServiceProvider(FactoryFinder.java:298) at javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:223) at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:128) at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.(SaxJBossXBParser.java:54) at org.jboss.xb.binding.UnmarshallerImpl.(UnmarshallerImpl.java:56) at org.jboss.xb.binding.UnmarshallerFactory$UnmarshallerFactoryImpl.newUnmarshaller(UnmarshallerFactory.java:96) at org.jboss.bootstrap.xml.BootstrapParser.parse(BootstrapParser.java:50) at org.jboss.bootstrap.microcontainer.ServerImpl.doStart(ServerImpl.java:123) at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:450) at org.jboss.Main.boot(Main.java:221) at org.jboss.Main$1.run(Main.java:556) at java.lang.Thread.run(Thread.java:662)

Я предполагаю, так как org.apache.xerces.jaxp.SAXParserFactoryImpl. метод вызван через sun.reflect он может использовать другой загрузчик классов, и у него нет моего javaagent на его пути.

Что здесь может быть неправильным и как я могу устранить это изнутри из javaagent? Я хочу сделать это с помощью этого агента как можно проще, если у меня не будет слишком много конфигураций.

ответ

1

Агент Java всегда загружается загрузчиком системного класса, который находит свои ресурсы в пути к классу. Вам нужно добавить свой журнал в путь к классу.

При запуске сервера приложений ваше приложение не загружается загрузчиком системного класса, но с загрузчиком класса, специфичным для приложения, которое вы используете. Регистратор тогда недоступен загрузчику системного класса.

Вам необходимо включить все файлы, которые используются вашим инструментальным классом, в банку агента и получить доступ к данным из класса пути класса. Обратите внимание, что серверы приложений обычно реализуют загрузчики классов child-first. Если вы добавите свой класс журнала для агента и вашего приложения, вы фактически получите доступ к двум различным классам регистратора.

Обычно, например, в проекте Maven, вы должны создать контейнер агента в отдельном модуле и включить регистратор в , предоставив область в ваше фактическое приложение.

 Смежные вопросы

  • Нет связанных вопросов^_^