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

问题描述

我正在尝试在模块化(Osgi 设置)中使用 Aspectj 编译器 ajc。似乎使用 ajc 的标准方法是将方面和 Java 代码变成一个 JAR,其中包含 -inpath-aspectpath 和 { {1}}。

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

因此,我分别编织每一束。然而,那么输出就被这些方面弄得一团糟。我想导入这些以保持方面模块正确的模块。但是,使用注解编程模型,我注意到 ajc 正在修改方面模块,因此我也需要重写它们。这很好,但由于我单独编织每个包,我有一个问题,方面的编织是否可以依赖于其他模块的编织?那是, 注释方面修改是否取决于它所编织的类?

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

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

总结:

  • @Aspect 注释类的修改是否取决于应用到的目标?
  • 我可以将带@Aspect 注释的类编译成单独的 JAR 吗?
  • 如何处理将在运行时提供并因此必须从输出 JAR 中排除的外部依赖项。
  • 关于 -inpath-inpath 中重叠资源路径的规则是什么?

更新同时我做了一个implementation in Bndtools

解决方法

@Aspect 注释类的修改是否取决于应用到的目标?

如果你想 100% 确定你必须阅读 AspectJ 源代码,但我会假设一个方面的字节码独立于它的目标类,否则你不能单独编译方面,也不能构建方面库.

我可以将@Aspect 注释的类编译成单独的 JAR 吗?

当然,见上文。

如何处理将在运行时提供并因此必须从输出 JAR 中排除的外部依赖项。

如果我正确理解了这个问题,您可能希望在编译期间将它们放在类路径上,而不是放在 inpath 上。

关于 -inpath-sourceroots 中重叠资源路径的规则是什么?

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


bndtools 似乎与 Eclipse 有着密切的联系。作为 Eclipse 项目的 AspectJ 也是如此。也许您可以联系 AspectJ 维护者 Andy Clement。不过,他忙于白天的工作,几乎没有任何空闲周期。我试图尽可能地减轻他的负担,但 OSGi 是我的盲点之一,我几乎不知道 AspectJ 源代码。我是一个高级用户。