2012-01-20 21 views
15

Ho un progetto Java EE 6 in Netbeans 7 che funziona correttamente quando lo compilo e lo avvio nell'IDE. Tuttavia, quando ho pulito e generare il progetto, io sono sempre unFilerException durante la creazione di Java EE 6 Progetto

java.lang.RuntimeException: javax.annotation.processing.FilerException: tentativo di ricreare un file per il tipo {myclass}

(dove myclass è sempre una classe di entità JPA) .

Quale classe di entità si modifica se cambio qualcosa nel codice.

Non ho idea di cosa possa causare questo errore: chiunque può fornire un'idea su cosa guardare.

L'unica lib di extra che sto utilizzando è Velocity.

Aggiornamento: Sto utilizzando due unità di persistenza sullo stesso database, una "normale" una e una non transazionale. Quello non-transazionale che uso per registrare le cose nel database; con un commit dopo ogni inserimento di un evento di log.

Quando lo cambio e uso solo il PU 'normale', il progetto viene compilato correttamente. Potrebbe essere che le due PU interferiscano con l'ottimizzazione fatta da eclipselink?

Qui è l'inizio della traccia dello stack:

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. 

risposta

4

Sembra, il problema è che io uso una stessa classe di entità in due diverse unità di persistenza. Non sono sicuro se ciò sia vietato dall'APP in generale o sia solo un problema con eclipselink.

Una "soluzione" che ho trovato è quella di duplicare la mia classe di entità. Non è bello, ma funziona per ora.

Altre risposte ancora benvenute.

22

Avere due unità di persistenza che utilizzavano la stessa classe Entity sembrava essere il problema.

Nel mio caso ho avuto un'unità per interrogare i dati e l'altra per l'autenticazione. Quello per l'autenticazione non ha bisogno di conoscere le mie classi Entity, quindi in Netbeans ho dovuto deselezionare le "Includi tutte le classi Entity in" MyWebServiceProject "Module".
Oppure aggiungi:

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

al file web.xml per quella unità di persistenza.

2

Ho lo stesso problema e l'ho diagnosticato un po 'al punto che ho una brutta soluzione che non è l'ideale.

Ho due unità di persistenza nel mio persistence.xml: uno per il test e uno per l'effettiva produzione.

La ragione per cui ho questo è perché se uso il metodo preferito di mettere un'altra persistenza.xml sotto la cartella src/tests/resources/META-INF, i test falliscono perché le classi generate vengono inserite nella cartella target/generate-sources/test-annotations e non finiscono nel posto giusto nel classpath una volta loro compilano.

Il problema è che se entrambi hanno "exclude-unlisted-classes" impostato su true, il compilatore javac tenta di ricreare le classi di annotazione durante il compilatore: compila e ovviamente fallisce sul secondo PU perché le classi hanno stato creato.

Quindi, per far funzionare tutto questo, ho impostato "exclude-unlisted-classes" su false per uno dei PU, che mi ottiene le meta class generate e i test falliscono (perché il PU non include il entità richieste).

Quindi capovolgo la bandiera su true ed eseguo di nuovo la build. Poiché le classi sono già state compilate, la compilazione: compile non viene eseguita e i test possono avere esito positivo.

Soluzione era proc: nessuno alle args compilatore javac come descritto qui: 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

Grazie, la tua risposta mi ha mostrato la giusta direzione: set * escludere-non quotati classi * a ** ** vera e aggiungere le entità manualmente per ogni persistenceUnit – GameDroids

14

ho ottenuto questo risolto impostando

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

per ogni unità di persistenza nel persistence.xml. Il valore deve essere unico per ogni unità. Le classi vengono quindi generate in diversi pacchetti, ad es. com.mycompany.foo.PojoOne_ e com.mycompany.bar.PojoOne_ anziché solo com.mycompany.PojoOne_.

Source

+0

ho avuto lo stesso problema e questa soluzione l'ha risolto –

0

Uso

Ho solo bisogno di aggiungere uno per la mia testPu (In memoria Derby per i test JUnit, piuttosto che dover effettivamente utilizzare l'installazione Glassfish/MySQL). Ciò ha reso il testPU distinto dal PU Runtime in connessione e sotto pacchetto, ma in caso contrario non ha influenzato le mie definizioni di entità.

0

includere le classi di entità per ciascuna unità di persistenza manualmente non deve includere la stessa classe in più di un'unità di persistenza.

+0

Benvenuti in SO! Non ha molto senso rispondere a una domanda così antica che in effetti ha molte risposte e anche una risposta marcata. Inoltre, devi leggere [questa sezione] (http://stackoverflow.com/help/how-to-answer) del Centro assistenza. –

5

Il responder deve effettuare questa operazione nel file 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> 

Ad esempio, i pacchetti del Entity1 verrà generato come:

entity1.prod 
entity1.dev 
0

Due unità di persistenza all'interno della stessa persistence.xml potrebbe essere utilizzando la stessa entità. Quindi, elimina una delle unità di persistenza o cambia le entità a cui si accede da entrambe le unità. Per fare questo aprire il file persistence.xml e scorrere verso il basso per vedere altre unità che hai aggiunto. Modificalo in base alle tue esigenze. Spero che questo aiuti.

0

Aggiungi alla persistenza.file xml linea

vero

Problemi correlati