javaagent attach - Glassfi sh - javassist - исключение несоответствия классов - PullRequest
1 голос
/ 25 мая 2020

Я использую механизм javaagent attach , и я хотел бы использовать javassist для инструментария метода, который импортирует класс из зависимости javax.servlet (в приложении Glassfi sh ):

import javax.servlet.ServletRequest;

Если я не вставляю вручную (во время инструментария метода) путь к классам в пул, я получаю ошибку NoClassDefFoundError. Насколько я понимаю, это вызвано тем, что код agent не может получить доступ к этому классу с целью повторной компиляции инструментированного метода. Чтобы обойти это, я включаю jar в свой метод transform внутри агента:

pool.insertClassPath("/usr/glassfish/app/WEB-INF/lib/servlet-api.jar");

Теперь я могу успешно инструментировать этот класс, используя метод insertBefore .

Однако! Если я попытаюсь получить доступ к первому аргументу инструментированного метода не только как к объекту (я могу преобразовать его в строку, чтобы увидеть его класс), но и путем преобразования его как ServletRequest из вышеупомянутой библиотеки servlet-api Я получаю странное исключение:

StandardWrapperValve[default]: Servlet.service() for servlet default threw exception
java.lang.NoClassDefFoundError: javax/servlet/ServletRequest
        at my.reporting.agent.AgentCallback.logAction(AgentCallback.java:60)

Вышесказанное предполагает, что обратный вызов агента не может найти определение класса. Но после поиска в Google Exception я обнаружил, что оно также может быть вызвано тем, что агент и приложение ссылаются на разные зависимости. И это так (частично): мой агент ссылается на зависимость от Maven:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.5</version>
  <scope>provided</scope>
</dependency>

Затем я импортирую этот класс точно так же, как это делает внедренное приложение (указано выше).

И инструментальное приложение, похоже, использует связанную версию этой банки:

Class loader: javax.servlet-api [166]
Resource: bundle://166.0:1/javax/servlet/Servlet...

Я не могу придумать способ указать моему агенту на связанную библиотеку в приложении Glassfi sh . А если в этом нет необходимости, то что здесь не так?

...