2012-01-20 83 views
15

我在Netbeans 7中有一個Java EE 6項目,它在我編譯並在IDE中啓動時運行良好。然而,當我清理並生成項目,我得到一個構建Java EE 6時的FilerException項目

java.lang.RuntimeExceptionjavax.annotation.processing.FilerException:嘗試重新創建類型的文件{myclass}

(其中myclass始終是一個JPA實體類) 。

如果我更改了代碼中的某些內容,它會更改哪個實體類。

我不知道什麼可能會導致此錯誤 - 任何人都可以提供一個想法看什麼。

我使用的唯一額外的lib是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. 

回答

4

看來,問題是,我使用的一個,並在兩個不同的持久化單元相同的實體類。我不確定這是由JPA禁止的,還是eclipselink的問題。

我發現的一個'解決方案'是複製我的實體類。不好,但現在工作。

更多的答案仍然歡迎。

22

有兩個持久單元使用相同的實體類似乎是問題。

在我的情況下,我有一個單元用於查詢數據,另一個用於驗證。用於身份驗證的人不需要知道我的實體類,因此在Netbeans中,我必須取消選中「在MyWebServiceProject」模塊中包含所有實體類「。
或加:

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

到該持久化單元的web.xml文件。

2

我有同樣的問題,並已診斷了一點,我有一個醜陋的解決方法,是不理想的。

我在persistence.xml中有兩個持久性單元:一個用於測試,一個用於實際生產構建。

我這樣做的原因是因爲如果我使用放置另一個持久性的首選方法。xml在src/tests/resources/META-INF文件夾下,測試失敗,因爲生成的類被放入目標/ generated-sources/test-annotations文件夾,並且不會在類路徑中的正確位置結束他們編譯。

問題是,如果兩者都將「exclude-unlisted-classes」設置爲true,則javac編譯器會嘗試在編譯器中重新創建註記類:編譯並且當然因爲類已經存在而在第二個PU上失敗被創建。所以爲了讓這個工作,我設置了「排除不列出的類」爲PU的一個,這讓我生成的元類,測試失敗(因爲PU不包括所需實體)。

然後我將標誌翻回爲true,然後再次運行構建。由於類已經被編譯,所以compile:compile不會運行,並且測試可以成功。

解決方法是PROC:這裏描述沒有給javac編譯ARGS:通過在persistence.xml設置

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

每個持久單元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> 
+0

謝謝,你的回答給我正確的方向:設置*排除,非流通類* **要真正**和手動添加實體每個persistenceUnit – GameDroids

14

我得到這個解決。該值必須對每個單元都是唯一的。然後將這些類生成爲不同的包,例如。 com.mycompany.foo.PojoOne_com.mycompany.bar.PojoOne_而不僅僅是com.mycompany.PojoOne_

Source

+0

我有同樣的問題,這個解決方案解決了它 –

0

使用

我只需要添加一個爲我testPu(在內存德比JUnit測試,而不需要實際使用Glassfish的/ MySQL的安裝)。這使得testPU與連接和子包中的運行時PU不同,但是不影響我的實體定義。

0

手動包含每個持久性單元的實體類 不應該在多於持久性單元中包含相同的類。

+0

歡迎來到SO!回答這樣一個事實上有很多答案並且被標記爲回答的老問題沒有多大意義。您還需要閱讀幫助中心的[本節](http://stackoverflow.com/help/how-to-answer)。 –

5

答案是在persistence.xml文件中做這個;相同的persistence.xml內

entity1.prod 
entity1.dev 
0
兩個

持久單元可能會使用相同的實體:

<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> 

例如,對於使用實體包將被生成。因此,要麼刪除一個持久性單元,要麼更改兩個單元訪問的實體。 要執行此操作,請打開persistence.xml文件並向下滾動以查看您添加的其他單位。根據您的要求修改它。 希望這有助於。

0

加入持久性。xml文件行

真正