Проблема с запуском AspectJ Load-Time-Weaving с помощью команды java

Я пытаюсь запустить и протестировать плетение времени загрузки аспекта J. Он успешно скомпилирован.

javac -cp "lib/*" -d classes src/*.java

Во время работы программы выводится только Hello. К сожалению, аспект не запустился.

java -javaagent:lib/aspectjweaver-1.9.19.jar -cp "lib/*:classes/" Runner

Это моя структура папок:

├── META-INF
│   └── aop.xml
├── classes
│   ├── HelloWorld.class
│   ├── HelloWorldAspect.class
│   └── Runner.class
├── lib
│   ├── aspectjrt-1.9.19.jar
│   └── aspectjweaver-1.9.19.jar
└── src
    ├── HelloWorld.java
    ├── HelloWorldAspect.java
    └── Runner.java

Содержимое файла:

public class HelloWorld {
  public void greet() {
    System.out.println("Hello");
  }
}
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.After;

@Aspect
public class HelloWorldAspect {
  @After("execution (* HelloWorld.*(..))")
  public void greetAspect() {
      System.out.println(", World");
  }
}
public class Runner {
  public static void main(String[] args) {
      HelloWorld h = new HelloWorld();
      h.greet();
  }
}
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver options = "-verbose -showWeaveInfo">
        <include within = "*" />
    </weaver>
</aspectj>

Я попытался -Daj.weaving.verbose=true посмотреть, загружена ли банка.

$ java -javaagent:lib/aspectjweaver-1.9.19.jar -cp "lib/*:classes/" -Dorg.aspectj.weaver.loadtime.configuration=/META-INF/aop.xml -Daj.weaving.verbose=true Runner

[AppClassLoader@18b4aac2] info AspectJ Weaver Version 1.9.19 built on Wednesday Dec 21, 2022 at 06:57:22 PST
[AppClassLoader@18b4aac2] info register classloader sun.misc.Launcher$AppClassLoader@18b4aac2
[AppClassLoader@18b4aac2] info no configuration found. Disabling weaver for class loader sun.misc.Launcher$AppClassLoader@18b4aac2
Hello

Я не хочу запускать инструмент ajc, а хочу запустить программу java и запустить аспект, чтобы увидеть результат Hello, World.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я еще не пытался скомпилировать и запустить ваш пример кода, но при чтении вашего вопроса я заметил две вещи:

  1. В вашем классе аспектов отсутствует аннотация @Aspect.
  2. В вашем проекте отсутствует файл aop.xml, в котором указаны параметры объединения во время загрузки (LTW). Вот почему в журнале вашей консоли написано "no configuration found. Disabling weaver". Дополнительную информацию см. в документации AspectJ LTW.

Если эти советы не помогут вам решить вашу проблему, не стесняйтесь комментировать этот ответ, но, пожалуйста, сначала попробуйте изучить документацию.


Обновление: после того, как вы разместили ссылку на свой репродуктор на GitHub, все еще остаются некоторые открытые вопросы:

Как именно вы построили и запустили проект? Очевидно, вы не использовали инструмент сборки, такой как Maven или Gradle. Вы зафиксировали файл подкачки Vim, поэтому я могу только догадываться, что вы каким-то образом вручную вызываете Javac и Java из Vim через командную строку или около того.

В любом случае, если сделать еще одно предположение, проблема может заключаться в том, что ткач AspectJ не видит файл aop.xml, потому что он должен оказаться в classs/META-INF/aop.xml, чего он не видит. Обычно вы никогда не должны передавать файлы классов или другие сгенерированные файлы в Git, но в этом случае просмотр каталога классов на GitHub дает мне подсказку.

Например, когда я пытался собрать ваш проект в IntelliJ IDEA, aop.xml не подхватывался, даже после пометки META-INF как каталога ресурсов. Затем я понял, что мне нужно поместить META-INF в подкаталог, например ресурсы, а затем пометить ресурсы как каталог ресурсов. Только тогда IDEA скопирует в выходной каталог весь каталог META-INF, а не только aop.xml.

Кстати, для чего нужен файл MANIFEST.MF со странными повторяющимися записями Premain-Class? Вам это вообще не нужно для запуска проекта. Просто удалите его.

Еще одна недостающая часть этой головоломки заключается в том, что вы должны добавить список активных <aspects> в aop.xml:

<aspectj>
  <weaver options = "-verbose -showWeaveInfo">
    <include within = "*"/>
  </weaver>
  <aspects>
    <aspect name = "HelloWorldAspect"/>
  </aspects>
</aspectj>

Это также описано на странице руководства, на которую я уже ссылался.

Кроме того, вы не должны помещать какие-либо классы или аспекты в пакет по умолчанию. Это только затрудняет использование конфигураций include/exclude в weaver, потому что вам нужно включить верхний уровень (пустой пакет).

Я попробовал то, что вы сказали, и все тот же результат.

Bishal Thapa 21.04.2023 19:43

Этот комментарий не может считаться полезным описанием ошибки. Пожалуйста, поделитесь полным минимальным проектом на GitHub.

kriegaex 21.04.2023 22:16

большое спасибо kriegaex, Вот ссылка на проект github.com/devbith/aspectj-aop-runtime.

Bishal Thapa 22.04.2023 01:19

Спасибо за MCVE. Обратите внимание на мой обновленный ответ выше.

kriegaex 22.04.2023 10:47

Большое спасибо. Это сработало. Я обновил репозиторий git, как было предложено. Теперь можно запустить и увидеть, как среда выполнения аспекта переплетается через командную строку.

Bishal Thapa 22.04.2023 14:33

Посмотрите, насколько ценен репродуктор и как он помогает вам быстрее получать лучшие ответы? Продолжайте делать это! 🙂

kriegaex 22.04.2023 18:44

Другие вопросы по теме