FilerException при сборке проекта Java EE 6 - PullRequest
18 голосов
/ 20 января 2012

У меня есть проект 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.

Ответы [ 10 ]

26 голосов
/ 30 марта 2012

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

В моем случае у меня был один модуль для запроса данных, а другой - для аутентификации.Для аутентификации не нужно знать о моих классах сущностей, поэтому в Netbeans мне пришлось снять флажок «Включить все классы сущностей в модуль« MyWebServiceProject »».
Или добавить:

<exclude-unlisted-classes>true</exclude-unlisted-classes>

в файл web.xml для этой единицы сохраняемости.

17 голосов
/ 30 мая 2013

Я решил это, установив

<property name="eclipselink.canonicalmodel.subpackage" value="foobar"/>

за каждую единицу сохраняемости в файле persistence.xml. Значение должно быть уникальным для каждой единицы. Затем классы генерируются в разные пакеты, например. com.mycompany.foo.PojoOne_ и com.mycompany.bar.PojoOne_ вместо просто com.mycompany.PojoOne_.

Источник

5 голосов
/ 24 марта 2015

Ответ должен сделать это в файле 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
4 голосов
/ 22 января 2012

Кажется, проблема в том, что я использую один и тот же класс сущностей в двух разных единицах персистентности.Я не уверен, является ли это запретом JPA в целом или это только проблема с eclipselink.

Одно «решение», которое я нашел, заключается в дублировании моего класса сущностей.Не хорошо, но работает на данный момент.

Дополнительные ответы все еще приветствуются.

2 голосов
/ 13 января 2013

У меня та же проблема, и я немного ее диагностировал, и у меня появился ужасный обходной путь, который не идеален.

В моем файле 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 и снова запускаю сборку. Поскольку классы уже скомпилированы, compile: compile не запускается, и тесты могут быть успешными.

Временное решение: proc: нет аргументов компилятора 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>
1 голос
/ 26 февраля 2014

Этот http://netbeans -org.1045718.n5.nabble.com / entity-class-generation-td5542168.html решил это за меня.Просто добавив -proc: none к опциям компилятора в NetBeans, удалил это тупое сообщение об ошибке.

0 голосов
/ 27 ноября 2016

Добавить в файл файла persistence.xml

true

0 голосов
/ 06 сентября 2016

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

0 голосов
/ 11 марта 2014

включает классы сущностей для каждой единицы персистентности вручную не должен включать один и тот же класс в единицу постоянства.

0 голосов
/ 17 июня 2013

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

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

...