1

技术栈:Arquillian Embedded-tomee、HSQLDB、openJpa、jdk 1.8。

我花了几天时间试图弄清楚如何让这一切一起工作,并且已经非常接近 IMO。现在我被这个非常普遍的错误困住了。

<openjpa-2.4.0-r422266:1674604 fatal general error>
org.apache.openjpa.persistence.PersistenceException: null

我已将所有实体添加到test-persistence.xml并正确放置在src/test/resources.

我尝试设置Runtime Unenhanced Classes初始问题supported并希望在Arquillian-Embedded-Tomee容器内的运行时发生增强。那里没有运气。不断收到错误消息,即我的某些实体没有运行时增强所需的公共/受保护的无参数构造函数。 注意:运行时增强在实际部署的 tomee 容器中运行良好。只是在 Arquillian 内部不起作用。

解决上述问题的第一种方法: 我不想将我的实体公开。所以切换到build-time-enhancement使用这里openjpa maven plugin描述的。这种方法取得了一些成功。实际上可以看到并验证在运行时实体正在得到增强。mvn clean install

构建输出:

 --- openjpa-maven-plugin:1.2:enhance---
some-persistent-unit  INFO   [main] openjpa.Tool - Enhancer running on 
type "class someClass".
some-persistent-unit  INFO   [main] openjpa.Tool - Enhancer running on 
type "class someotherclass".

等等...

但这里的问题是:测试仅在 Maven 构建期间通过。如果我尝试运行测试类中的单个测试或该测试类中的所有测试,它们会失败。而且在这种方法中,我在持久性上下文中禁用了对未增强类的运行时支持。

<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>

因此,我得出结论,它openjpa-maven-plugin按预期工作。

问题 1:这是预期的行为吗?测试在 Maven 构建之外不起作用吗?问题2:openjpa 插件是否提供了javaagent幕后功能?

不知道该怎么做,我改用了另一种(???)方法:尝试使用此处发布javaagent的类似问题所描述的 运行增强功能。没有成功。最终出现以下错误:

<<< ERROR! org.apache.openjpa.persistence.ArgumentException: This 
configuration disallows runtime optimization, but the following listed types 
were not enhanced at build time or at class load time with a javaagent: "
List of entities described in test-persistence.xml

问题 3:那么如何设置构建时间增强功能,并确保这些增强功能适用于我运行的每个单元测试?

问题 4:更好的是,我如何(如果可能)将构建时间增强设置为仅针对在 Arquillian 内部运行的测试进行。

还是我一开始就错了?

4

1 回答 1

0

Q1:如果您的 IDE 没有运行 openjpa 插件而只进行编译,那么您将错过增强功能

Q2:不,插件和 javaagent 都使用相同的增强实现,但您可以将它们视为不同的钩子(构建与运行时)

Q3:取决于你的IDE,使用eclipse你需要生命周期插件来配置openjpa,使用Intellij你需要在运行配置的Make阶段之后添加openjpa:enhance

Q4:使用 tomee 遥控器自动完成

我认为使用 javaagent 仍然是解决增强问题的最佳方法,你真的只需要确保 maven 和/或你的测试配置有 -javaagent:/path/to/openejb-javaagent.jar

于 2017-05-28T19:03:22.867 回答