Исключение Filer при создании проекта Java EE 6
У меня есть проект Java EE 6 в Netbeans 7, который отлично работает при компиляции и запуске в среде IDE. Однако, когда я чищу и создаю проект, я получаю
java.lang.RuntimeException
: javax.annotation.processing.FilerException
: попытка воссоздать файл для типа { myclass
}
(где myclass
всегда является классом сущности JPA).
Какой класс сущности изменяется, если я что-то изменил в коде.
Я не знаю, что может вызвать эту ошибку. Кто-нибудь может представить, на что смотреть.
Единственной дополнительной библиотекой, которую я использую, является Velocity.
Обновить. Я использую два блока сохранения в одной базе данных, один "нормальный" один и один не транзакционный. Не транзакционный, который я использую для записи в базу данных; с фиксацией после каждой вставки события журнала.
Когда я меняю это и использую только один "обычный" PU, проект компилируется отлично. Может ли быть так, что два PU-интерфейса мешают некоторой оптимизации, сделанной eclipselink?
Вот начало трассировки стека:
An annotation processor threw an uncaught exception.
Consult the following stack trace for details.
java.lang.RuntimeException: javax.annotation.processing.FilerException: Attempt to recreate a file for type de.guj.contenthub.ftdts.entity.AgofEntry_
at org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor.process(CanonicalModelProcessor.java:407)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:625)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:554)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:699)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:981)
at com.sun.tools.
Ответы
Ответ 1
Кажется, проблема в том, что я использую один и тот же класс сущности в двух разных единицах сохранения. Я не уверен, что это запрещено JPA вообще или это только проблема с eclipselink.
Одно "решение", которое я нашел, это дублировать класс сущности. Не нравится, но работает пока.
Другие ответы по-прежнему приветствуются.
Ответ 2
Кажется, что проблема связана с двумя единицами сохранения, использующими один и тот же класс Entity.
В моем случае у меня было одно устройство для запроса данных, а другое для аутентификации. Тому для аутентификации не нужно знать о моих классах Entity, поэтому в Netbeans мне нужно было снять флажок "Включить все сущности в модуль MyWebServiceProject".
Или добавьте:
<exclude-unlisted-classes>true</exclude-unlisted-classes>
в файл web.xml для этой единицы персистентности.
Ответ 3
Я решил это, установив
<property name="eclipselink.canonicalmodel.subpackage" value="foobar"/>
для каждой единицы сохранения в persistence.xml. Значение должно быть уникальным для каждого устройства. Затем классы сгенерированы в разные пакеты, например. com.mycompany.foo.PojoOne_
и com.mycompany.bar.PojoOne_
вместо com.mycompany.PojoOne_
.
Источник
Ответ 4
Answser должен сделать это в файле persistence.xml;
<persistence-unit name="prod_PU">
<properties>
<property name="eclipselink.canonicalmodel.subpackage" value="prod"/>
</properties>
</persistence-unit>
<persistence-unit name="dev_PU">
<properties>
<property name="eclipselink.canonicalmodel.subpackage" value="dev"/>
</properties>
</persistence-unit>
Например, пакеты для объекта entity1 будут сгенерированы как:
entity1.prod
entity1.dev
Ответ 5
У меня такая же проблема, и я поставил диагноз немного до такой степени, что у меня есть уродливое обходное решение, которое не является идеальным.
У меня есть две единицы персистентности в моем persistence.xml: один для тестирования и один для фактической сборки.
Причина в том, что, если я использую предпочтительный метод размещения другого persistence.xml в папке src/tests/resources/META-INF, тесты терпят неудачу, потому что сгенерированные классы попадают в целевой/сгенерированный -sources/test-annotations и не попадают в нужное место в пути к классам после их компиляции.
Проблема заключается в том, что если оба имеют "exclude-unlisted-classes" равны true, компилятор javac пытается воссоздать классы аннотаций во время компилятора: компилировать и, конечно же, терпеть неудачу на втором PU, потому что классы уже были создан.
Итак, чтобы это сработало, я установил "exclude-unlisted-classes" в false для одного из PU, который получает мне сгенерированные мета-классы, а тесты терпят неудачу (потому что PU не включает требуемые лица).
Затем верните флаг в true и снова запустите сборку. Поскольку классы уже скомпилированы, компиляция: компиляция не запускается, и тесты могут быть успешными.
Обходной путь был proc: none для аргументов компилятора javac, как описано здесь: http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
<proc:none/>
<Xlint/>
<Xlint:-path/>
<verbose />
</compilerArguments>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
Ответ 6
Этот http://netbeans-org.1045718.n5.nabble.com/entity-class-generation-td5542168.html решил это для меня. Просто добавление -proc: none к параметрам компилятора в NetBeans удалено из-за тупого сообщения об ошибке.
Ответ 7
Использование
Мне нужно было только добавить один для моего testPu (в памяти Derby для тестов jUnit, а не для фактического использования установки Glassfish/MySQL). Это сделало testPU отличным от Runtime PU в соединении и subpackage, но в остальном не повлияло на мои определения сущностей.
Ответ 8
включить классы сущностей для каждой единицы сохранения вручную
не должен включать один и тот же класс больше, чем единица сохранения.
Ответ 9
Две единицы сохранения в одном и том же файле persistence.xml могут использовать один и тот же объект. Таким образом, либо удалите один из единиц сохранения, либо измените объекты, к которым обращаются оба устройства.
Для этого откройте файл persistence.xml и прокрутите вниз, чтобы увидеть другие добавленные вами единицы. Измените его в соответствии с вашими требованиями.
Надеюсь, это поможет.
Ответ 10
Добавить в строку состояния persistence.xml
True