0

我正在使用 AspectJ 1.9.7,并且正在尝试使用ajc. 假设我有一个名为的模块test和以下树:

.
└── test
    ├── aspectj
    │   ├── Main.java
    │   └── TestAspect.aj
    └── module-info.java

使用javac我用来编译它的命令是:

javac --module-source-path . -d ../bin -m test

一切都很好,当然没有编织过程。相反,如果我尝试使用ajc( ajc --module-source-path . -d ../bin -m test) 运行同一行,则输出为:

[error] build config error: dir arg not permitted: test
    
[error] unrecognized single argument: "-m"
    
[error] no sources specified
    

3 errors

我想此时该-m选项不受支持。我发现了这个问题,用户说可以在编译过程中指定使用 javac-usejavac的选项,但至少对我而言,它不起作用,甚至无法识别该选项。

1)如何--module-source-path使用ajc


假设--module-source-path不支持,我选择了该--module-path选项。同样,使用javac,一切正常:

javac -d bin --module-path test $(find . -name *.java)

但是切换到ajc( ajc -d bin --module-path test $(find . -name *.java -o -name *.aj)),输出是这样的:

/home/maluz/Desktop/OneDrive/First Semester/TSP/labs/lab2/Test/test/module-info.java:1 [error] Syntax error on token "module", aspect expected
module test {
^^^^^

1 error

删除时相同的输出--module-path

2)有没有办法编译一个模块ajc

另一种方法是:

# I compile every *.java and *.aj except module-info.java with ajc
$ ajc -d bin $(find . \( -name *.java -o -name *.aj \) -and \( -not -name *module-info.java \))

# I compile module-info.java separately with javac
$ javac --module-path test -d bin/ test/module-info.java

它可以工作,但必须有一种方法可以做到这一点ajc,鉴于此,--module-path并且--module-source-path记录在man的模块编译选项下。ajc我不确定这是否相关,但我正在使用openjdk 15.0.2 2021-01-19.

4

1 回答 1

0

感谢这个博客,我找到了部分解决方案。第一个问题仍未得到解答,因为该--module选项未被识别。尽管如此,似乎可以编译一个模块ajc

ajc -d bin --release 15 --module-path path/to/aspectjrt.jar $$(find . -name *.java -o -name *.aj)

和一个小的变化module-info.java

module test {
    exports aspectj;
    requires org.aspectj.runtime;
}

至于我所理解的,您需要指定您的应用程序兼容的java版本:这是通过--releaseoption完成的。

然后,为了使用 AspectJ 类和运行时类型,您需要将 导入aspectjrt.jar到模块路径中,并requiremodule-info.java. 这个 jar 默认放在$HOME/aspectj${version}/lib/aspectjrt.jar.


我不接受我的回答,因为--module-source-pathwithajc对我来说仍然是个谜。

于 2022-01-19T22:52:31.593 回答