【问题标题】:AspectJ (ajc) with Modules带有模块的 AspectJ (ajc)
【发布时间】: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-pathajc


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

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

但是切换到ajcajc -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


    【解决方案1】:

    感谢this blog,我找到了部分解决方案。第一个问题仍未得到解答,因为 --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-pathajc 对我来说仍然是个谜。

    【讨论】:

    • 感谢您提出这个问题。目前我们在 AJC 中有一个bug when parsing the --module-source-path option(它源自 ECJ,Eclipse Java 编译器),导致编译器进行核心转储。这可能可以修复,但请注意,即便如此,ECJ 目前也有一个problem handling module source paths with *,即如果您想使用多模块编译模式,您需要使用默认目录布局,模块直接位于指定的基本目录下方。
    • 请问为什么要使用多模块编译模式?在您描述的情况下,我认为没有任何好处。如果您期望--module-source-path 使您不必再指定所有要编译的文件,我不得不让您失望。 Javac 和 ECJ 都不是这种情况。您仍然必须列出所有源文件。
    • @kriegaex 感谢您解释当前情况。我只是在探索 AspectJ 并想测试它是否完全支持模块。 Javac 和 ECJ 都不是这种情况,据我所知,使用类似 javac --module-source-path . -d output-folder -m mod1(,mod)* 的 javac 应该可以工作。为什么说相反呢?
    • 可能是因为我完全是 JMS 菜鸟,以前从未在我的任何项目中使用过模块。我不知道我必须结合这两个 CLI 选项。稍后我将再次靠近计算机时再检查一下,刚刚在路上。对不起,如果我可能说了一些愚蠢的话。你肯定比我更了解模块。
    • 这与 Javac 配合得很好,但 ECJ 中没有 --module <module>(,<module>)*-m <module>(,<module>)* 选项。因此,它在 ACJ 中也不存在。即,目前您需要单独编译每个模块并真正指定所有源文件,使用$(find ...) 或源列表文件。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多