我正在使用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是在ajc man的模块编译选项下记录的。我不确定这是否相关,但我使用的是openjdk 15.0.2 2021-01-19。
发布于 2022-01-19 22:52:31
多亏了这个博客,我找到了一个部分解决方案。第一个问题仍未回答,因为--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版本:这是使用--release选项完成的。
然后,为了使用AspectJ类和运行时类型,需要将aspectjrt.jar导入模块路径,并在module-info.java中将自动模块名require。默认情况下,这个jar放在$HOME/aspectj${version}/lib/aspectjrt.jar中。
我不会接受我的答案,因为--module-source-path with ajc对我来说仍然是个迷。
https://stackoverflow.com/questions/70769899
复制相似问题