我的实体对象分散在多个罐子中。
在 jar AI 中有一个基类名称 MyBase,它带有 @MappedSuperclass 注释。
在 jar B 中有一个派生自 MyBase 的实体类。
问题是因为编织是在 jar 文件的上下文中完成的(我使用的是 maven 插件),所以基类(MyBase)没有被检测(尽管它应该)。
如果我将派生类从 jar B 移动到 A,那么编织过程也将处理基础。
由于我正在从事一个大型项目,因此以模块化方式进行开发对我来说至关重要。
EclipseLink 不支持这种方法吗?
3 回答
我发现覆盖此限制的唯一方法是在定义 @MappedSuperclass 基类的 jar 中添加一个临时实体类,并在编织过程后将其删除。
悲伤,但真实;-)
我不确定 maven 插件,但你应该能够在两个 jar 上使用静态编织器,你需要调用它两次来编织两个,并且需要在 weavers 类路径上的两个 jar 来调用。
或者,您可以将包含您的超类的 jar 指定为 inpath - 如此处和此处所解释的:
管理多个项目
构建 AspectJ 源代码需要两个不同的阶段;编译 .java 和 .aj 文件中的源代码以生成 .class 文件,然后将方面应用于生成的 .class 文件。第二个阶段,称为编织,是 AspectJ 和 Java 编译器之间的主要区别。Java 编译过程由类路径设置控制,这使得编译器可以解析类型。AspectJ 编译过程使用相同的类路径设置,并且在 Eclipse 中以完全相同的方式进行配置。但是,此设置不足以在所有情况下控制编译和编织步骤。这就是为什么 AspectJ 项目有两个额外设置可用的原因。
首先,有 inpath 设置。此处指定的任何内容都将可供编织器使用,因此将编织任何适用的方面。可以通过右键单击项目,选择“属性”,然后转到“AspectJ InPath”部分,将条目添加到项目的输入路径中。条目可以是 JAR 文件或目录(类文件夹),例如另一个项目的 bin 目录。在可能与方面编织之后,inpath 上的任何内容都会发送到项目的输出。
第二个附加设置是方面路径。虽然 inpath 控制要编织的内容列表,但 aspectpath 控制要编织到该列表中的内容。换句话说,在方面路径上指定的任何方面都可用于编织过程,就像它们以源代码形式存在于项目中一样。此设置由 AspectJ Aspect Path 属性页控制,可以包含 JAR 文件或目录。
每个项目的属性页的 AspectJ 部分中也存在一个输出 JAR 设置。此设置导致编译器将类文件直接输出到 JAR 文件,而不是项目的输出文件夹。
像你一样让我发疯 - 希望这会有所帮助。;)