Подтвердить что ты не робот

Исключение 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.
4b9b3361

Ответ 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>

Ответ 7

Использование

Мне нужно было только добавить один для моего testPu (в памяти Derby для тестов jUnit, а не для фактического использования установки Glassfish/MySQL). Это сделало testPU отличным от Runtime PU в соединении и subpackage, но в остальном не повлияло на мои определения сущностей.

Ответ 8

включить классы сущностей для каждой единицы сохранения вручную не должен включать один и тот же класс больше, чем единица сохранения.

Ответ 9

Две единицы сохранения в одном и том же файле persistence.xml могут использовать один и тот же объект. Таким образом, либо удалите один из единиц сохранения, либо измените объекты, к которым обращаются оба устройства. Для этого откройте файл persistence.xml и прокрутите вниз, чтобы увидеть другие добавленные вами единицы. Измените его в соответствии с вашими требованиями. Надеюсь, это поможет.

Ответ 10

Добавить в строку состояния persistence.xml

True