Netbeans7にJava EE 6プロジェクトがあり、IDEでコンパイルして起動すると正常に実行されます。ただし、プロジェクトをクリーンアップしてビルドすると、
Java.lang.RuntimeException
:javax.annotation.processing.FilerException
:タイプ{myclass
}のファイルの再作成を試みます
(ここで、myclass
は常にJPAエンティティークラスです)。
コード内で何かを変更すると、どのエンティティクラスが変更されますか。
何がこのエラーを引き起こすのか私にはわかりません-誰かが何を見るべきかについての考えを提供できますか?.
私が使用している唯一の追加ライブラリはVelocityです。
更新:同じデータベースで2つの永続ユニットを使用しています。1つは「通常」のもので、もう1つは非トランザクションユニットです。私がデータベースに物事を記録するために使用する非トランザクションのもの。ログイベントを挿入するたびにコミットします。
これを変更して、1つの「通常の」PUのみを使用すると、プロジェクトは正常にコンパイルされます。 2つの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.
問題は、2つの異なる永続性ユニットで1つの同じエンティティクラスを使用していることです。これがJPAによって一般的に禁止されているのか、それともeclipselinkの問題だけなのかはわかりません。
そのとき見つけた「解決策」の1つは、エンティティクラスを複製することです。ニースではありませんが、今のところは機能します。
より多くの答えはまだ歓迎します。
同じEntityクラスを使用する2つの永続性ユニットがあることは問題のようでした。
私の場合、1つのユニットはデータのクエリ用で、もう1つのユニットは認証用でした。認証用のものは私のエンティティクラスについて知る必要がないので、Netbeansでは「「MyWebServiceProject」モジュールにすべてのエンティティクラスを含める」のチェックを外さなければなりませんでした。
または追加:
<exclude-unlisted-classes>true</exclude-unlisted-classes>
その永続性ユニットのweb.xmlファイルに。
私はこれを設定することで解決しました
<property name="eclipselink.canonicalmodel.subpackage" value="foobar"/>
永続性.xmlの永続性ユニットごとに。値はユニットごとに一意である必要があります。次に、クラスはさまざまなパッケージに生成されます。 com.mycompany.foo.PojoOne_
およびcom.mycompany.bar.PojoOne_
だけでなくcom.mycompany.PojoOne_
。
答えは、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
私は同じ問題を抱えており、理想的ではない醜い回避策があるという点まで少し診断しました。
私のpersistence.xmlには2つの永続性ユニットがあります。1つはテスト用で、もう1つは実際の本番ビルド用です。
私がそれを持っている理由は、src/tests/resources/META-INFフォルダーの下に別のpersistence.xmlを置くという好ましい方法を使用すると、生成されたクラスがtarget/generate-sources /に置かれるため、テストが失敗するためです。 test-annotationsフォルダーであり、コンパイル後にクラスパスの適切な場所に配置されません。
問題は、両方で「exclude-unlisted-classes」がtrueに設定されている場合、javacコンパイラはcompiler:compile中にアノテーションクラスを再作成しようとし、もちろん2番目のPUクラスはすでに作成されているためです。
したがって、これを機能させるために、PUの1つで「exclude-unlisted-classes」をfalseに設定すると、生成されたメタクラスが取得され、テストが失敗します(PU必要なエンティティは含まれていません)。
次に、フラグをtrueに戻し、ビルドを再度実行します。クラスはすでにコンパイルされているため、compile:compileは実行されず、テストは成功します。
回避策は、ここで説明されているように、javacコンパイラ引数に対してproc:noneでした: 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>
これ http://netbeans-org.1045718.n5.nabble.com/entity-class-generation-td5542168.html 私のためにそれを解決しました。 NetBeansのコンパイラオプションに-proc:noneを追加するだけで、その鈍いエラーメッセージが削除されました。
Persistence.xmlファイル行に追加します
<exclude-unlisted-classes>true</exclude-unlisted-classes>
使用する
TestPu用に1つ追加するだけで済みました(Glassfish/MySQLのインストールを実際に使用する必要はなく、jUnitテスト用のメモリ内のDerby)。これにより、testPUは、接続およびサブパッケージでランタイムPUと区別されましたが、それ以外はエンティティ定義に影響しませんでした。
各永続性ユニットのエンティティクラスを手動で含めるには、永続性ユニット以外に同じクラスを含めないでください。
同じpersistence.xml内の2つの永続ユニットが同じエンティティを使用している可能性があります。したがって、永続性ユニットの1つを削除するか、両方のユニットがアクセスするエンティティを変更します。これを行うには、persistence.xmlファイルを開き、下にスクロールして、追加した別のユニットを表示します。要件に応じて変更してください。お役に立てれば。