问题描述
我正在尝试在模块化(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 源代码。我是一个高级用户。