首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带模的AspectJ (ajc)

带模的AspectJ (ajc)
EN

Stack Overflow用户
提问于 2022-01-19 11:35:27
回答 1查看 213关注 0票数 0

我正在使用AspectJ 1.9.7,并试图用ajc编译一个模块化的应用程序。让我们假设我有一个名为test的模块和下面的树:

代码语言:javascript
复制
.
└── test
    ├── aspectj
    │   ├── Main.java
    │   └── TestAspect.aj
    └── module-info.java

对于javac,我用来编译它的命令是:

代码语言:javascript
复制
javac --module-source-path . -d ../bin -m test

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

代码语言:javascript
复制
[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-pathajc结合使用

假设不支持--module-source-path,我选择了--module-path选项。同样,对于javac,一切都很好:

代码语言:javascript
复制
javac -d bin --module-path test $(find . -name *.java)

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

代码语言:javascript
复制
/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编译一个模块?

另一种选择是:

代码语言:javascript
复制
# 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

EN

回答 1

Stack Overflow用户

发布于 2022-01-19 22:52:31

多亏了这个博客,我找到了一个部分解决方案。第一个问题仍未回答,因为--module选项未被识别。尽管如此,使用ajc编译模块似乎是可能的。

代码语言:javascript
复制
ajc -d bin --release 15 --module-path path/to/aspectjrt.jar $$(find . -name *.java -o -name *.aj)

以及module-info.java中的一个小变化

代码语言:javascript
复制
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对我来说仍然是个迷。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70769899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档