@MappedSuperclass 使用 EclipseLink 和多个 jar 进行静态编织

Posted

技术标签:

【中文标题】@MappedSuperclass 使用 EclipseLink 和多个 jar 进行静态编织【英文标题】:@MappedSuperclass static weaving with EclipseLink and multiple jars 【发布时间】:2012-11-15 07:15:46 【问题描述】:

我的实体对象分散在多个罐子中。 在 jar A 中,我有一个基类名称 MyBase,它带有 @MappedSuperclass 注释。 在 jar B 中有一个派生自 MyBase 的实体类。 问题是因为编织是在 jar 文件的上下文中完成的(我使用的是 maven 插件),所以基类 (MyBase) 没有被检测(尽管它应该)。 如果我将派生类从 jar B 移动到 A,那么编织过程也将处理基础。 由于我正在从事一个大型项目,因此以模块化方式进行开发对我来说至关重要。 EclipseLink 不支持这种方法吗?

【问题讨论】:

【参考方案1】:

我发现覆盖此限制的唯一方法是将临时实体类添加到定义 @MappedSuperclass 基类的 jar 中,并在编织过程后将其删除。 悲伤,但真实 ;-)

【讨论】:

是的,虚拟实体工作正常。但是,我为此创建了错误报告,您可能想要投票:bugs.eclipse.org/bugs/show_bug.cgi?id=466271【参考方案2】:

我不确定 maven 插件,但你应该能够在两个 jar 上使用静态编织器,你需要调用它两次来编织两个,并且需要在 weavers 类路径上的两个 jar 来调用.

【讨论】:

问题是第二个 jar 依赖于第一个,所以我需要先构建第一个,然后才能构建第二个。这意味着将编织过程移出与我无关的构建过程。不过还是谢谢。【参考方案3】:

或者,您可以将包含超类的 jar 指定为 inpath - 如 here 和 here 所述:

管理多个项目

构建 AspectJ 源代码需要两个不同的阶段;编译 .java和.aj文件中的源生成.class文件,然后 将方面应用于生成的 .class 文件。这第二阶段, 称为编织,是 AspectJ 和 Java 之间的关键区别 编译器。 Java 编译过程由类路径控制 设置,使编译器可以解析类型。 AspectJ 编译过程使用相同的类路径设置 它在 Eclipse 中的配置方式完全相同。然而,这 设置不足以同时控制编译和编织 在所有情况下的步骤。这就是为什么有两个额外的设置 可用于 AspectJ 项目。

首先,有 inpath 设置。此处指定的任何内容都是 提供给织工,因此适用的任何方面都将是 织入。可以通过右键单击将条目添加到项目的路径中 在项目上,选择属性,然后转到 AspectJ InPath 部分。条目可以是 JAR 文件或目录(类 文件夹),例如另一个项目的 bin 目录。什么都在 inpath 被发送到项目的输出,之后可能是 与方面交织在一起。

第二个附加设置是方面路径。而inpath 控制被编织的东西的列表,aspectpath 控制 该列表中包含的内容。换句话说,任何指定的方面 方面路径可用于编织过程,就像 它们以源代码形式存在于项目中。这个设置是 从 AspectJ Aspect Path 属性页控制,并且可以包含 JAR 文件或目录。

输出 JAR 设置也存在于每个文件的 AspectJ 部分 项目的属性页。此设置导致编译器输出 类文件直接到 JAR 文件,而不是到项目的输出 文件夹。

像你一样让我发疯 - 希望这会有所帮助。 ;)

【讨论】:

感谢您的回答,但正如我在另一个答案中所写的那样,问题是第二个 jar 取决于第一个,所以我需要先构建第一个,然后才能构建第二个。这意味着将编织过程移出与我无关的构建过程。

以上是关于@MappedSuperclass 使用 EclipseLink 和多个 jar 进行静态编织的主要内容,如果未能解决你的问题,请参考以下文章

@MappedSuperclass的用法

注解@MappedSuperclass的作用

我可以在界面上使用@MappedSuperclass注释吗?

在 Zend 框架 2 中使用 MappedSuperclass 的 Doctrine 2 多对多

从数据库中选择 MappedSuperclass (Hibernate)

JPA-@MappedSuperclass