Aspectj,如何以模块化的方式使用ajc

Aspectj, how to use ajc in a modular way

我正在尝试在模块化(OSGi 设置)中使用 Aspectj 编译器 ajc。使用 ajc 的标准方法似乎是采用方面和 java 代码并将其转换为一个 JAR,其中包含 all classes 和资源 -inpath-aspectpath-sourceroots

我正在尝试编织 方面来自 bnd 的 OSGi 可执行 JAR。这个可执行 jar 包含一组需要编织的包。但是,在模块化系统中,边界非常重要。一方面,清单通常包含与该捆绑包或众多 扩展程序 之一高度相关的信息。将所有 classes 扁平化成一个大博客是行不通的。

因此,我分别编织每一捆。但是,输出会因方面而变得杂乱无章。我想导入这些以保持方面模块适当的模块。但是,使用注释编程模型,我注意到 ajc 正在修改方面模块,因此我也需要重写这些模块。这很好,但是由于我分别编织了每个包,所以我有一个问题,即 方面 的编织是否可能取决于编织其他模块的内容?那是, 注释的 aspect 的修改是否取决于它所编织的 classes?

另一个问题是同名资源会怎样?由于我的 -inpath 只有一个 JAR(包),我注意到我最终在输出中得到了正确的清单 (META-INF/MANIFEST.MF)。但是,如果 -inpath 包含许多捆绑包,清单将是什么?或者任何其他具有相同路径并因此重叠的资源?

最后一个问题是外部依赖。我知道 acj 想要看到整个世界并将整个世界包含到输出 JAR 中。但是,我必须排除捆绑包的外部依赖性。有没有办法将 JAR 标记为:使用,但不包含。有点像maven 'provided' scope?

总结:

更新 与此同时,我做了一个 implementation in Bndtools.

Does the modification of an @Aspect annotated class depend on the targets that is applied to?

如果您想 100% 确定您必须阅读 AspectJ 源代码,但我会假设方面的字节码独立于其目标 classes,否则您无法编译方面分开,也不构建方面库。

Can I compile the @Aspect annotated classes into separate JARs?

当然,见上文。

How to handle the external dependencies that will be provided in the runtime and thus must be excluded from the output JAR.

如果我理解正确的话,你可能希望在编译期间将它们放在 class 路径上,而不是 inpath 上。

What are the rules around overlapping resource paths in the -inpath and -sourceroots?

同样,您可能需要查看源代码。如果我是你,我会简单地假设选择顺序是未定义的,并确保首先没有重复项。应该有 Maven 插件帮助您过滤想要的结果。


bndtools 似乎与 Eclipse 关系密切。作为 Eclipse 项目的 AspectJ 也是如此。也许您可以联系 AspectJ 维护者 Andy Clement。虽然他被白天的工作淹没了,但他几乎没有空闲的自行车。我试图尽可能地减轻他的负担,但 OSGi 是我的盲点之一,我几乎不知道 AspectJ 源代码。我是比较高级的用户。