我在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.
让两个持久性单元使用同一个Entity类似乎是个问题。
在我的案例中,我有一个用于查询数据的单元,另一个用于身份验证。用于身份验证的不需要知道我的实体类,所以在Netbeans中,我不得不取消选中"在MyWebServiceProject模块中包含所有实体类"
或者添加:
<exclude-unlisted-classes>true</exclude-unlisted-classes>
到该持久性单元的web.xml文件。
我通过设置解决了这个问题
<property name="eclipselink.canonicalmodel.subpackage" value="foobar"/>
对于persistence.xml中的每个持久性单元。每个单元的值必须是唯一的。然后将类生成为不同的包,例如com.mycompany.foo.PojoOne_
和com.mycompany.bar.PojoOne_
,而不仅仅是com.mycompany.PojoOne_
。
源
answser将在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>
例如,实体1的包将生成为:
entity1.prod
entity1.dev
问题似乎是我在两个不同的持久性单元中使用了一个相同的实体类。我不确定这是JPA普遍禁止的,还是只是eclipselink的问题。
我找到的一个"解决方案"是复制我的实体类。不太好,但目前有效。
更多的答案仍然欢迎。
我也有同样的问题,我已经诊断出了一个不理想的丑陋解决方案。
我的persistence.xml中有两个持久性单元:一个用于测试,另一个用于实际的生产构建。
我这样做的原因是,如果我使用首选的方法,将另一个persistence.xml放在src/tests/resources/META-INF文件夹下,那么测试就会失败,因为生成的类会被放在目标/生成的源/测试注释文件夹中,并且在编译后不会出现在类路径中的正确位置。
问题是,如果两者都将"排除未列出的类"设置为true,javac编译器会在编译器期间尝试重新创建注释类:编译,当然在第二个PU上失败,因为类已经创建。
因此,为了实现这一点,我将其中一个PU的"排除未列出的类"设置为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>
此http://netbeans-org.1045718.n5.nabble.com/entity-class-generation-td5542168.html为我解决了这个问题。只需在NetBeans的编译器选项中添加-proc:none就删除了那个迟钝的错误消息。
使用
我只需要为我的testPu添加一个(用于jUnit测试的内存中Derby,而不需要实际使用Glassfish/MMySQL安装)。这使得testPU在连接和子包方面与Runtime PU不同,但在其他方面不会影响我的实体定义。
手动包含每个持久单元的实体类不应在多个持久性单元中包含相同的类。
同一persistence.xml中的两个持久性单元可能使用同一实体。因此,要么删除其中一个持久性单元,要么更改两个单元访问的实体。为此,打开persistence.xml文件并向下滚动以查看您添加的其他单元。根据您的要求进行修改。希望这能有所帮助。
添加到persistence.xml文件行
<exclude-unlisted-classes>true</exclude-unlisted-classes>