Как я могу выполнить улучшение времени сборки объектов JPA при выполнении теста Arquillian?
Технологический стек: Arquillian Embedded-Tomee, HSQLDB, openJpa, jdk 1.8.
Я потратил несколько дней, пытаясь понять, как я могу заставить все это работать вместе, и очень близко подошел к ИМО. И теперь я застрял с этой очень общей ошибкой.
<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.
Или я с самого начала подхожу к этому неправильно?
1 ответ
В1: если ваша IDE не запускает плагин openjpa, а только выполняет компиляцию, вы пропустите улучшение да
Q2: нет, и плагин, и javaagent используют одну и ту же реализацию расширения, но вы можете видеть их как разные хуки (сборка против времени выполнения)
Q3: зависит от вашей IDE, с eclipse вам нужен плагин жизненного цикла для настройки openjpa, а с Intellij вам нужно добавить openjpa: Improve после фазы Make в конфигурации run
Q4: с пультом Tomee это делается автоматически
Я думаю, что использование javaagent по-прежнему является лучшим способом решения проблемы улучшения, вам просто нужно убедиться, что maven и / или ваша тестовая конфигурация имеют -javaagent:/path/to/openejb-javaagent.jar