Не удается запустить скомпилированный файл класса ajc в терминале с использованием Java

Я пытаюсь изучить аспект для проекта. Я хочу запускать 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.

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

Ответы 1

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

В пути к классам компиляции 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-программу из командной строки, возможно, еще не время для второго шага. Здания без прочного фундамента, как правило, шаткие.

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