2012-01-20 9 views
15

Mam projekt Java EE 6 w Netbeans 7, który działa poprawnie po skompilowaniu i uruchomieniu go w środowisku IDE. Jednak, kiedy czyścić i zbudować projekt, jestem corazWyjątek FilerException podczas budowania projektu Java EE 6

java.lang.RuntimeException: javax.annotation.processing.FilerException: próba odtworzenia pliku dla typu {myclass}

(gdzie myclass jest zawsze klasa jednostka JPA) .

Którą klasę obiektu zmienia się, jeśli zmienię coś w kodzie.

Nie mam pojęcia, co może spowodować ten błąd - czy ktoś może dać pomysł, na co patrzeć.

Jedyną dodatkową biblioteką, której używam, jest prędkość.

Aktualizacja: Używam dwóch jednostek trwałości w tej samej bazie danych, jednej "normalnej" i jednej nietransakcyjnej. Ten nie-transakcyjny, którego używam do rejestrowania danych w bazie danych; z zatwierdzeniem po każdym wstawieniu zdarzenia dziennika.

Kiedy to zmienię i używam tylko "normalnego" PU, projekt kompiluje się dobrze. Czy to możliwe, że obie PUR zakłócają jakąś optymalizację wykonaną przez eclipselink?

Oto początek ślad stosu:

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. 

Odpowiedz

4

Wydaje się, że problem jest, że należy skorzystać z jednej i tej samej klasy podmiotem w dwóch różnych jednostkach wytrwałości. Nie jestem pewien, czy jest to zabronione przez WZP w ogóle, czy jest tylko problem z eclipselink.

Jednym z "rozwiązań", które znalazłem, jest skopiowanie mojej klasy jednostek. Nieźle, ale działa na razie.

Więcej odpowiedzi nadal mile widziane.

22

Posiadanie dwóch jednostek trwałości przy użyciu tej samej klasy Entity wydaje się być problemem.

W moim przypadku miałem jedną jednostkę do sprawdzania danych, a drugą do uwierzytelniania. Ten do uwierzytelniania nie musi wiedzieć o moich klasach Entity, więc w Netbeans musiałem odznaczyć opcję "Include All Entity Classes in" MyWebServiceProject "Module".
Albo dodać:

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

do pliku web.xml dla tej jednostki trwałości.

2

Mam ten sam problem i zdiagnozowałem to nieco do tego stopnia, że ​​mam brzydkie obejście, które nie jest idealne.

Mam dwie jednostki wytrwałości w moim persistence.xml: jeden do testowania i jeden do rzeczywistej kompilacji produkcji.

Powodem, dla którego tak jest, ponieważ używam preferowanej metody umieszczania innej trwałości.xml w folderze src/tests/resources/META-INF, testy kończą się niepowodzeniem, ponieważ wygenerowane klasy zostają umieszczone w folderze target/generated-sources/test-adnotations i nie trafiają w odpowiednie miejsce w ścieżce klasy raz oni się kompilują.

Problem polega na tym, że jeśli obie mają "wykluczone-niepubliczne-klasy" ustawione na true, kompilator javac próbuje ponownie utworzyć klasy adnotacji podczas kompilatora: kompilacja i oczywiście zawiedzie na drugim PU, ponieważ klasy już są został stworzony.

Aby to zadziałało, ustawiam "wykluczone-niepubliczne-klasy" na false dla jednej z PU, która generuje mi wygenerowane klasy meta, a testy kończą się niepowodzeniem (ponieważ PU nie zawiera wymagane podmioty).

Następnie przerzucam flagę z powrotem na true i ponownie uruchamiam kompilację. Ponieważ klasy zostały już skompilowane, kompilacja: kompilacja nie działa, a testy mogą się powieść.

Obejście było Proc: żaden z kompilatora javac args jak opisano tutaj: 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

Dzięki plik xml, odpowiedź pokazał mi właściwy kierunek: set * Wykluczenie-niewyświetlane na liście-klasy * ** do ** prawdziwe i dodać podmioty ręcznie dla każdego persistenceUnit – GameDroids

14

mam to rozwiązać poprzez ustawienie

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

dla każdej jednostki utrwalania w persistence.xml. Wartość musi być unikalna dla każdej jednostki. Klasy są następnie generowane w różnych pakietach, np. com.mycompany.foo.PojoOne_ i com.mycompany.bar.PojoOne_ zamiast tylko com.mycompany.PojoOne_.

Source

+0

miałem ten sam problem i to rozwiązanie go rozwiązało. –

0

Korzystanie

Potrzebowałem tylko dodać jedną dla mojego testPu (w pamięci Derby dla testów JUnit, zamiast konieczności faktycznie korzysta instalację GlassFish/MySQL). To spowodowało, że testPU różni się od Runtime PU w ​​połączeniu i podpakietem, ale poza tym nie wpłynęło to na definicje mojej jednostki.

0

obejmują klasy jednostek dla każdej jednostki trwałości ręcznie: nie powinna zawierać tej samej klasy w więcej niż jednostce trwałości.

+0

Witaj w SO! Nie ma większego sensu udzielanie odpowiedzi na tak stare pytanie, które w rzeczywistości ma wiele odpowiedzi i naznaczonych również. Musisz również przeczytać [tę sekcję] (http://stackoverflow.com/help/how-to-answer) w Centrum pomocy. –

5

Odpowiednik ma to zrobić w pliku 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> 

Na przykład pakiety dla entity1 zostanie wygenerowany jako:

entity1.prod 
entity1.dev 
0

dwie jednostki utrwalania w obrębie tej samej persistence.xml może być przy użyciu tego samego podmiotu. Więc usuń jedną z jednostek trwałości lub zmień jednostki dostępne dla obu jednostek. Aby to zrobić, otwórz plik persistence.xml i przewiń w dół, aby zobaczyć inne dodane jednostki. Zmodyfikuj zgodnie z wymaganiami. Mam nadzieję, że to pomoże.

Powiązane problemy