2012-01-20 4 views
15

Netbeans 7에서 Java EE 6 프로젝트를 컴파일하고 IDE에서 시작할 때 잘 실행됩니다. javax.annotation.processing.FilerException : 내가 프로젝트를 청소하고 구축 할 때, 나는FilerException Java EE 6 프로젝트를 빌드 할 때

java.lang.RuntimeException 얻고 유형에 대한 파일을 다시하는 시도를 {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

동일한 Entity 클래스를 사용하는 두 개의 지속성 단위가 문제가되는 것 같습니다.

제 경우에는 데이터를 쿼리하고 인증을 위해 하나의 장치가 있습니다. 인증을위한 하나는 내 엔티티 클래스에 대해 알 필요가 없으므로 Netbeans에서 "MyWebServiceProject"모듈의 "모든 엔티티 클래스 포함"을 선택 취소해야했습니다.
또는 추가 지속성 단위 web.xml 파일에

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

.

2

나는 똑같은 문제가있어 이상하지 않은 추악한 해결 방법이 있다는 점을 조금 지적했다.

내 persistence.xml에 두 개의 지속성 단위가 있습니다. 하나는 테스트 용이고 다른 하나는 실제 프로덕션 빌드 용입니다.

다른 지속성을 적용하는 기본 방법을 사용하면 그 이유가 있습니다.xml을 src/tests/resources/META-INF 폴더 아래에 복사하면 생성 된 클래스가 target/generated-sources/test-annotations 폴더에 저장되고 클래스 경로의 올바른 위치에 한번 있지 않으므로 테스트가 실패합니다 그들은 컴파일한다.

"exclude-unlisted-classes"가 true로 설정된 경우 javac 컴파일러는 컴파일러 : annotation 클래스를 다시 작성하려고 시도합니다. 컴파일은 물론 클래스가 이미 있으므로 두 번째 PU에서 실패합니다 생성되었습니다.

이 작업을 수행하려면 생성 된 메타 클래스를 가져 오는 PU 중 하나에 대해 "exclude-unlisted-classes"를 false로 설정하고 테스트에 실패합니다 (PU에 필수 개체).

그런 다음 플래그를 다시 true로 되돌리고 빌드를 다시 실행하십시오. 클래스가 이미 컴파일 되었기 때문에 컴파일 : 컴파일이 실행되지 않고 테스트가 성공할 수 있습니다.

해결 PROC이었다 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> 
+0

감사

사실, 당신의 대답은 나에게 올바른 방향을 보여 주었다 : 설정 * 제외-목록에없는-클래스 * ** ** 진실하고 각 – GameDroids

14

I이 해결되었다 persistence.xml을 각 지속성 유닛

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

를 설정. 값은 각 장치마다 고유해야합니다. 그런 다음 클래스는 다른 패키지로 생성됩니다. com.mycompany.PojoOne_ 대신 com.mycompany.foo.PojoOne_com.mycompany.bar.PojoOne_입니다.

Source

+0

을 persistenceUnit 수동 엔티티를 추가 저도 같은 문제를했고, 이 해결책은 그것을 해결했다 –

0

난 단지 내 testPu 하나를 추가하는 데 필요한 사용 (오히려 필요로하는 것보다, JUnit 테스트를 위해 메모리 더비에서 실제로 글래스 피시/MySQL 설치 사용). 이로 인해 testPU는 연결 및 서브 패키지의 런타임 PU와 구별되지만, 그렇지 않으면 내 엔티티 정의에 영향을주지 않습니다.

0

각각의 영속성 단위에 대한 엔티티 클래스를 수동으로 포함하십시오. 은 영속성 단위 이상에 동일한 클래스를 포함하지 않아야합니다.

+0

SO! 실제로 많은 답을 갖고 있으며 답변을 표시 한 오래된 질문에 대답하는 것은별로 의미가 없습니다. 또한 도움말 센터의 [이 섹션] (http://stackoverflow.com/help/how-to-answer)을 읽어야합니다. –

5

answser는 이것을 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> 

는 예를 들어, entity1위한 패키지로서 생성된다. 따라서 영속 유닛 중 하나를 삭제하거나 두 유닛이 액세스 한 엔티티를 변경하십시오. 이렇게하려면 persistence.xml 파일을 열고 아래로 스크롤하여 추가 한 다른 단위를 확인하십시오. 요구 사항에 따라 수정하십시오. 희망이 도움이됩니다.

0

지속성에 추가하십시오.XML 파일 라인