无法在使用Java的终端中运行ajc编译的类文件

hgqdbh6s  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(120)

我试图为一个项目学习aspectj。我希望使用ajc和java从终端运行java文件,但我无法这样做。
我有2个文件在我的目录HelloWorld.java和HWTracer.aj
www.example.com的内容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)

请注意,我绝对不是JavaMaven。

u0sqgete

u0sqgete1#

在编译类路径上,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会将其解释为主类的命令行参数。
在你尝试理解像AspectJ这样复杂的工具之前,请先学习一些Java基础知识。如果你甚至不知道如何从命令行正确运行Java程序,也许现在还不是迈出第二步的时候。没有坚实基础的建筑往往会摇摇欲坠。

相关问题