【发布时间】:2022-01-19 11:35:27
【问题描述】:
我正在使用 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 选项。我找到了this question,其中用户说可以在编译过程中指定选项-usejavac 以使用javac,但至少对我而言,它不起作用并且该选项是甚至不认识。
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 的模块编译选项 中。我不确定这是否相关,但我使用的是openjdk 15.0.2 2021-01-19。
【问题讨论】:
标签: java aspectj java-module ecj ajc