构建 Java EE 6 项目时出现 FilerException

Posted

技术标签:

【中文标题】构建 Java EE 6 项目时出现 FilerException【英文标题】:FilerException when building Java EE 6 Project 【发布时间】:2012-02-14 20:52:22 【问题描述】:

我在 Netbeans 7 中有一个 Java EE 6 项目,当我在 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.

【问题讨论】:

【参考方案1】:

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

我发现的一个“解决方案”是复制我的实体类。不太好,但目前可以使用。

欢迎更多答案。

【讨论】:

【参考方案2】:

让两个持久化单元使用同一个实体类似乎确实是个问题。

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

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

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

【讨论】:

【参考方案3】:

我遇到了同样的问题,并且已经诊断到我有一个不理想的丑陋解决方法。

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

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

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

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

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

解决方法是 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>

【讨论】:

谢谢,您的回答为我指明了正确的方向:将 exclude-unlisted-classes 设置为 true 并为每个 persistenceUnit 手动添加实体跨度> 【参考方案4】:

我通过设置解决了这个问题

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

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

Source

【讨论】:

【参考方案5】:

使用

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

欢迎来到 SO!回答这样一个实际上有很多答案并且标记为已回答的老问题没有多大意义。另外你需要阅读帮助中心的this section。【参考方案8】:

答案是在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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

添加到 persistence.xml 文件行

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

【讨论】:

以上是关于构建 Java EE 6 项目时出现 FilerException的主要内容,如果未能解决你的问题,请参考以下文章

在 Glassfish 4.1.1 上部署 Java EE 时出现 java.lang.NullPointerException

每次尝试将项目导入eclipse时出现Java问题

使用 QT+VTK+ITK 构建项目时出现 FDFImageIO 错误

尝试模块化 Gradle SpringBoot 项目,但在尝试构建时出现“错误:找不到符号”?

使用 Gradle 构建时出现类缓存错误

Android Studio 在运行 Flutter 项目时出现问题