Я нашел обходной путь, который позволяет мне запускать сервер без проблем, а также использовать различные типы точек наложения аспектов для всех видов классов, таких как внутренние классы Jetty:
Скопируйте ткач AspectJ и вашу библиотеку аспектов (JAR, содержащий аспекты и META-INF / aop.xml ) в подкаталог lib , где вы начинаете свои орды .war . Затем добавьте библиотеку аспектов в путь к классу загрузки JVM. Вам нужно использовать версию JRE / JDK, такую как Java 8, которая на самом деле все еще поддерживает загрузочный путь к классам. (На самом деле я только что проверил, JDK 11 все еще поддерживает его.) Я не знаю, как это сделать с модульными JRE. Затем начните свою WAR так:
java -Xbootclasspath/a:lib/aspect.jar -javaagent:lib/aspectjweaver.jar -jar ords.war standalone
Еще раз с вставленными переносами строк:
java
-Xbootclasspath/a:lib/aspect.jar
-javaagent:lib/aspectjweaver.jar
-jar ords.war standalone
Этот подход гарантирует, что ткач присоединен и его классы, а также классы аспектов найдены до того, как загрузчик классов JAR Oracle выполнит магию точки входа.
Обратите внимание, что вам вообще не нужно изменять файл WAR.
Обновление: В качестве альтернативы вы можете подключить ткацкий агент AspectJ динамически, а не через -javaagent
, см.
Я быстро проверил, все работает. Это довольно сложно, хотя:
- Вы должны поместить свой собственный основной класс, аналогичный тому, который есть в AspectJ read-me, в WAR как основной класс. Этот класс прикрепит ткача и затем запустит загрузчик классов JAR. Теперь ткач уже на месте, и все работает, как ожидалось.
- Предостережение заключается в том, что вам нужно запустить JVM с
tools.jar
, myaspect.jar
и aspectjweaver.jar
на пути к классам,
- либо при загрузке classpath, если вы хотите запустить приложение с
java -jar my.war
- или по обычному classpath Вам, если можно запустить приложение с
-cp ...;my.war my.own.MainClass
.
- Также, поскольку в Java 9 больше нет
tools.jar
, но вам нужно сделать свой собственный класс точки входа зависимым от модуля jdk.attach
, а также убедиться, что вы действительно запускаете приложение с JDK, а не с JRE. В противном случае вы не сможете использовать API для динамического подключения агентов.
В целом, я все еще предпочитаю оригинальное решение, его гораздо проще реализовать.