Я пытаюсь запустить и протестировать плетение времени загрузки аспекта 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.




Я еще не пытался скомпилировать и запустить ваш пример кода, но при чтении вашего вопроса я заметил две вещи:
@Aspect."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, потому что вам нужно включить верхний уровень (пустой пакет).
Этот комментарий не может считаться полезным описанием ошибки. Пожалуйста, поделитесь полным минимальным проектом на GitHub.
большое спасибо kriegaex, Вот ссылка на проект github.com/devbith/aspectj-aop-runtime.
Спасибо за MCVE. Обратите внимание на мой обновленный ответ выше.
Большое спасибо. Это сработало. Я обновил репозиторий git, как было предложено. Теперь можно запустить и увидеть, как среда выполнения аспекта переплетается через командную строку.
Посмотрите, насколько ценен репродуктор и как он помогает вам быстрее получать лучшие ответы? Продолжайте делать это! 🙂
Я попробовал то, что вы сказали, и все тот же результат.