构建Java EE 6项目时出现FilerException

时间:2012-01-20 09:01:02

标签: netbeans java-ee-6

我在Netbeans 7中有一个Java EE 6项目,当我在IDE中编译并启动它时运行正常。但是,当我清理并构建项目时,我得到了一个

  

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.

10 个答案:

答案 0 :(得分:26)

使用相同的Entity类有两个持久性单元似乎确实是问题。

在我的情况下,我有一个用于查询数据的单元,另一个用于身份验证。用于身份验证的那个不需要了解我的实体类,因此在Netbeans中我必须取消选中“在MyWebServiceProject”模块中包含“包含所有实体类”。
或者添加:

  

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

到该持久性单元的web.xml文件。

答案 1 :(得分:17)

我通过设置

解决了这个问题
<property name="eclipselink.canonicalmodel.subpackage" value="foobar"/>

表示persistence.xml中的每个持久性单元。每个单元的值必须是唯一的。然后将类生成到不同的包中,例如。 com.mycompany.foo.PojoOne_com.mycompany.bar.PojoOne_而非com.mycompany.PojoOne_

Source

答案 2 :(得分:5)

答案是在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.prod
entity1.dev

答案 3 :(得分:4)

看来,问题在于我在两个不同的持久性单元中使用同一个实体类。我不确定JPA是否禁止这一点,或者只是eclipselink的问题。

我发现的一个“解决方案”是复制我的实体类。不好,但现在有效。

仍然欢迎更多答案。

答案 4 :(得分:2)

我遇到了同样的问题,并且已经诊断出一点,我有一个不太理想的难看的解决方法。

我的persistence.xml中有两个持久性单元:一个用于测试,一个用于实际的生成构建。

我之所以这样做是因为如果我使用在src / tests / resources / META-INF文件夹下放置另一个persistence.xml的首选方法,则测试失败,因为生成的类被放入目标/生成-sources / test-annotations文件夹,编译后不会在类路径中的正确位置结束。

问题是,如果两者都将“exclude-unlisted-classes”设置为true,那么javac编译器会尝试在编译器期间重新创建注释类:编译,当然在第二个PU上失败,因为类已经是创建

为了使这个工作起作用,我将其中一个PU的“exclude-unlisted-classes”设置为false,这将获得生成的元类,并且测试失败(因为PU不包含所需的实体)。

然后我将标志翻转回true,然后再次运行构建。由于类已经编译,因此compile:compile不会运行,测试可以成功。

解决方法是proc:none到javac编译器args,如下所述: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>

答案 5 :(得分:1)

http://netbeans-org.1045718.n5.nabble.com/entity-class-generation-td5542168.html为我解决了这个问题。只需在NetBeans中的编译器选项中添加-proc:none即可删除该钝错错误消息。

答案 6 :(得分:0)

使用

我只需要为testPu添加一个(在内存Derby中进行jUnit测试,而不是需要实际使用Glassfish / MySQL安装)。这使得testPU与连接和子包中的运行时PU不同,但不会影响我的实体定义。

答案 7 :(得分:0)

手动包含每个持久性单元的实体类 不应该在持久性单元中包含相同的类。

答案 8 :(得分:0)

同一个persistence.xml中的两个持久性单元可能正在使用同一个实体。因此,要么删除其中一个持久性单元,要么更改两个单元访问的实体。 要执行此操作,请打开persistence.xml文件并向下滚动以查看您添加的其他单元。根据您的要求进行修改。 希望这会有所帮助。

答案 9 :(得分:0)

添加到persistence.xml文件行