Я использую механизм 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 . А если в этом нет необходимости, то что здесь не так?