netbeans - curso - FilerException al construir el proyecto Java EE 6
curso java web (10)
Parece que el problema es que utilizo una y la misma clase de entidad en dos unidades de persistencia diferentes. No estoy seguro de si esto está prohibido por JPA en general o solo es un problema con eclipselink.
Una ''solución'' que encontré entonces es duplicar mi clase de entidad. No es lindo, pero funciona por ahora.
Más respuestas aún bienvenidas.
Tengo un proyecto Java EE 6 en Netbeans 7 que funciona bien cuando lo compilo e inicio en el IDE. Sin embargo, cuando limpio y construyo el proyecto, obtengo un
java.lang.RuntimeException
:javax.annotation.processing.FilerException
: intento de volver a crear un archivo para el tipo {myclass
}
(donde myclass
es siempre una clase de entidad JPA).
¿Qué clase de entidad es? Cambia si cambio algo en el código.
No tengo idea de qué podría causar este error. ¿Alguien puede darme una idea de qué mirar?
La única lib extra que estoy usando es Velocity.
Actualización : estoy usando dos unidades de persistencia en la misma base de datos, una "normal" una y otra no transaccional. El no transaccional que uso para registrar cosas en la base de datos; con una confirmación después de cada inserción de un evento de registro.
Cuando lo cambio y solo uso una PU ''normal'', el proyecto compila bien. ¿Podría ser que las dos PU interfieran con alguna optimización realizada por eclipselink?
Aquí está el comienzo del rastro de la pila:
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.
Estoy teniendo el mismo problema, y lo he diagnosticado un poco al punto que tengo una solución fea que no es ideal.
Tengo dos unidades de persistencia en mi persistence.xml: una para probar y otra para la compilación de producción real.
La razón por la que tengo eso es porque si uso el método preferido para poner otro persistence.xml en la carpeta src / tests / resources / META-INF, las pruebas fallan porque las clases generadas se colocan en un target / generated-sources / la carpeta de anotaciones de prueba y no terminan en el lugar correcto en el classpath una vez que se compilan.
El problema es que si ambos tienen el "exclude-unlisted-classes" en verdadero, el compilador javac intenta recrear las clases de anotación durante el compilador: compilar y, por supuesto, falla en el segundo PU porque las clases ya se han creado.
Entonces, para que esto funcione, configuré "exclude-unlisted-classes" en falso para una de las PU, lo que me da las metacategorías generadas y las pruebas fallan (porque la PU no incluye las entidades requeridas).
Luego cambio la bandera a verdadero y vuelvo a ejecutar la compilación. Como las clases ya se han compilado, compile: compile no se ejecuta y las pruebas pueden tener éxito.
La solución fue proc: none para los argumentos del compilador javac como se describe aquí: 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>
Lo solucioné estableciendo
<property name="eclipselink.canonicalmodel.subpackage" value="foobar"/>
para cada unidad de persistencia en persistence.xml. El valor debe ser exclusivo para cada unidad. Las clases se generan en diferentes paquetes, por ej. com.mycompany.foo.PojoOne_
y com.mycompany.bar.PojoOne_
lugar de solo com.mycompany.PojoOne_
.
Utilizando
Solo necesité agregar uno para mi testPu (In memory Derby para pruebas jUnit, en lugar de necesitar usar realmente la instalación de Glassfish / MySQL). Esto hizo que la unidad de prueba fuera distinta de la unidad de tiempo de ejecución en la conexión y el subpaquete, pero de lo contrario no afectó a las definiciones de mi entidad.
Este http://netbeans-org.1045718.n5.nabble.com/entity-class-generation-td5542168.html lo resolvió por mí. Simplemente agregando -proc: none a las opciones del compilador en NetBeans eliminó ese obtuso mensaje de error.
incluir las clases de entidad para cada unidad de persistencia manualmente no debe incluir la misma clase en más de una unidad de persistencia.
El remitente debe hacer esto en el archivo 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>
Por ejemplo, los paquetes para la entidad1 se generarán como:
entity1.prod
entity1.dev
Dos unidades de persistencia dentro del mismo persistence.xml podrían estar usando la misma entidad. Entonces, elimine una de las unidades de persistencia o cambie las entidades a las que acceden ambas unidades. Para hacer esto, abra el archivo persistence.xml y desplácese hacia abajo para ver otras unidades que haya agregado. Modifíquelo según sus requisitos. Espero que esto ayude.
Agregar a la línea del archivo persistence.xml
cierto
Tener dos unidades de persistencia que usan la misma clase de entidad parece ser el problema.
En mi caso, tenía una unidad para consultar datos y la otra para la autenticación. El de autenticación no necesita saber sobre mis clases de Entidad, así que en Netbeans tuve que desmarcar el "Incluir Todas las Clases de Entidades en" MyWebServiceProject "Módulo".
O agregue:
<exclude-unlisted-classes>true</exclude-unlisted-classes>
al archivo web.xml para esa unidad de persistencia.