Исключение класса не найдено с помощью Java-агента byte buddy

Я пытаюсь использовать byte Buddy с большим приложением. Сейчас я хочу просто вывести что-то из метода ввода/вывода с помощью @Advice. Мой агент правильно прикрепляется к приложению и строится. В журналах я также вижу, что преобразование указанного класса также выполняется. Проблема в том, что когда я отправляю запрос на нужную RestEndpoint и вызывается метод, я получаю сообщение об ошибке:

javax.servlet.ServletException: A MultiException has 1 exceptions.  They are:
1. java.lang.NoClassDefFoundError: com/agent/MyAdviser

at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:391)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)

Мой агент:

LOG.info("Before Agent Builder build !!!");
          new AgentBuilder.Default()
                  .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
                    .type(is(MyClassToCatch.class))
                  .transform(
                        new AgentBuilder.Transformer.ForAdvice()
                        .include(MyAgent.class.getClassLoader())
                        .advice(ElementMatchers.any(), MyAdviser.class.getName())
                )
                .installOn(inst);

И MyAdviser.class:

public class MyAdviser {

private static final Logger LOG = LoggerFactory.getLogger(MyAdviser.class);

@Advice.OnMethodEnter
public static void onEnterExit() {
    LOG.info("INTERCEPTED BBB <<<>>> BBB");
}

Проблема как-то связана с загрузчиком классов? БР,

Решение Рафаэля помогло.

EDIT: я также пытался перехватить метод и просто вызвать его без каких-либо изменений, но я закончил с такой ошибкой:

com.agent.DiscoveryAgent - On Error of : MyClassToCatch       None of [net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@7815f1c, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@a193f70f, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@d6fdc355, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@66e2275b, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@19cb065f, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@4fc13971, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@aea74e0e, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@2ac04890, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@f5eef57c, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@e1b04a0f, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@f0de1c86] allows for delegation from public javax.ws.rs.core.Response MyClassToCatch.someMethod()

person Macko    schedule 01.03.2017    source источник


Ответы (1)


Код в классе совета копируется в целевой класс. Это означает, что он должен иметь возможность разрешать класс MyAdviser. Если это невозможно, необходимо:

  1. Определите Logger как поле в преобразованном классе с помощью defineField и аннотации @FieldValue.
  2. Динамически читайте регистратор из совета и ссылайтесь на другой класс, видимый как корень журнала.
person Rafael Winterhalter    schedule 01.03.2017
comment
Привет Рафаэль! Спасибо за помощь, я, наконец, сделал это, и что-то вышло из системы, как и ожидалось. - person Macko; 03.03.2017