Я пытаюсь изучить аспект для проекта. Я хочу запускать java-файлы с терминала, используя ajc и java, но я не могу этого сделать.
У меня есть 2 файла в моем каталоге HelloWorld.java и HWTracer.aj
Содержимое Helloworld.java
public class HelloWorld {
public static void main(String[] args) {
printMsg("Hello, World!!");
}
public static void printMsg(String msg) {
System.out.println("\n");
System.out.println(" " + msg);
System.out.println("\n");
}
}
Содержание HWTracer.aj
public aspect HWTracer {
// pointcuts
pointcut theMainMethod() : execution(public static void main(String[]));
pointcut theCall() : call (* HelloWorld.printMsg(*));
// advice
before(): theMainMethod() {
System.out.println("Before the Main");
}
// note this is after main is done, after the entire program finishes
after(): theMainMethod() {
System.out.println("After the Main");
}
before(): theCall() {
System.out.println("-- before the call --");
}
after(): theCall() {
System.out.println("-- after the call --");
}
}
Вот команда, которую я использую для компиляции кода
ajc .\HelloWorld.java .\HWTracer.aj -cp C:\aspectj1.9\lib\aspectjrt.jar;C:\aspectj1.9\lib\aspectjtools.jar;C:\aspectj1.9\lib\aspectjweaver.jar
Я запускаю скомпилированный файл с помощью следующей команды:
java -cp C:\aspectj1.9\lib\aspectjrt.jar HelloWorld HWTracer
И я получаю следующую ошибку:
Exception in thread "main" java.lang.NoClassDefFoundError: org/aspectj/lang/NoAspectBoundException
at HelloWorld.main(HelloWorld.java:5)
Обратите внимание, что я ни в коем случае не являюсь экспертом по Java.
В пути к классам компиляции aspectjrt
должно быть достаточно, как и во время выполнения.
В пути к классам среды выполнения вам нужно добавить каталог, в котором находятся ваши скомпилированные файлы классов, в вашем случае, очевидно, только текущий каталог "."
:
xxx> ajc -cp "lib\aspectjrt.jar" HelloWorld.java HWTracer.aj
xxx> java -cp ".;lib\aspectjrt.jar" HelloWorld
Before the Main
-- before the call --
Hello, World!!
-- after the call --
After the Main
Также обратите внимание, что при запуске основного класса нет необходимости отдельно упоминать аспектный класс. Java будет интерпретировать его как параметр командной строки для основного класса.
Пожалуйста, сначала изучите основы Java, прежде чем пытаться понять такой сложный инструмент, как AspectJ. Если вы даже не знаете, как правильно запустить Java-программу из командной строки, возможно, еще не время для второго шага. Здания без прочного фундамента, как правило, шаткие.
Можете ли вы отредактировать свой вопрос и добавить свой код? минимальный воспроизводимый пример был бы полезен.