2011-12-20 6 views
6

Esto me está volviendo loco y estoy sorprendido de que official documentation sea absolutamente útil.Cómo hacer una mejora OpenJPA con Ant + IntelliJ IDEA

Aquí es lo que tengo:

  • IntelliJ IDEA 11
  • OpenJPA 2.1.1

Como se suma openjpa en la lista de bibliotecas usadas que ya tenía ruta de clases a que se parece a OpenJPA esto

<path id="library.openjpa.classpath"> 
    <fileset dir="${basedir}/lib/openjpa"> 
     <patternset refid="library.patterns"/> 
    </fileset> 
</path> 

De acuerdo con la documentación oficial, agregué el siguiente objetivo

<target name="enhance"> 
    <copy includeemptydirs="false" todir="${basedir}/lib/openjpa"> 
     <fileset dir="src" excludes="**/*.launch, **/*.java"/> 
    </copy> 

    <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask"> 
     <classpath refid="library.openjpa.classpath"/> 
    </taskdef> 

    <openjpac> 
     <classpath refid="library.openjpa.classpath"/> 
    </openjpac> 
</target> 

Me da excepción

C: \ work \ prj \ build.xml: 283: org.apache.openjpa.util.MetaDataException: MetaDataFactory no podía ser configurado (conf. newMetaDataFactoryInstance() devolvió nulo). Esto podría significar que no se encontraron propiedades de configuración. Asegúrese de tener un archivo META-INF/persistence.xml, que está disponible en su classpath, o que el archivo de propiedades que está utilizando para la configuración es disponible. Si está utilizando Ant, consulte los atributos del elemento anidado de la tarea. Esto también puede ocurrir si sus jar de distribución OpenJPA están dañados o si su política de seguridad es demasiado estricta.

He probado con Process Monitor y se puede ver que se abre y lee persistence.xml.

Alguna persona filed bug teniendo problemas que tengo y la respuesta que obtuvo fue que encontrar persistence.xml no es una fuente de problema.

Las preguntas son:

  1. ¿Qué puedo hacer para que funcione?
  2. ¿Puedo hacer que funcione omitiendo la necesidad de persistence.xml y simplemente especificando el patrón para los archivos .class que quiero mejorar?
  3. Es más una pregunta de Ant. ¿Cómo puedo hacer que Enhancer de OpenJPA busque persistence.xml en un directorio que no sea el de openjpa-2.1.1.jar?
+0

¿Ha verificado que el directorio META-INF está en su classpath? – Rick

+0

No sé cómo especificar un directorio adicional de classpath en el script Ant. Pero solo para estar seguro de haber copiado 'persistence.xml' en el directorio donde se encuentra el jar de OpenJPA. – expert

Respuesta

8

Así que no podía hacer que funcione sin indocumentado propertiesFile. Aquí está la versión que funciona para mí. También al especificar persistence-unit a través de #, falla con NullReferenceException.

<target name="enhance"> 
    <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask"> 
     <classpath refid="library.openjpa.classpath"/> 
    </taskdef> 

    <openjpac> 
     <classpath refid="library.openjpa.classpath"/> 
     <classpath location="${reporting.output.dir}"/> 
     <config propertiesFile = "${basedir}/src/META-INF/persistence.xml"/> 
    </openjpac> 
</target> 
0

Parece que es posible que haya omitido una parte importante de la documentación. Su library.openjpa.classpath le falta una referencia a sus Entidades, y la ubicación del archivo persistence.xml. Intenta agregar eso y ver cómo funciona.

<path id="jpa.enhancement.classpath"> 
    <pathelement location="bin"/> <!-- add something like this --> 

    <!-- lib contains all of the jars that came with the OpenJPA binary download --> 
    <fileset dir="lib"> 
    <include name="**/*.jar"/> 
    </fileset> 
</path> 
+0

Nah, cuando no puede encontrar mis entidades, da una excepción ClassNotFound en ellas. Me las arreglé para hacer que funcione a través de línea de comandos y vía Ant. Cuatro horas de mi vida que nunca volveré. – expert

+0

Si coloca META-INF/persistence.xml en bin, debería haber funcionado. – Rick

+1

Sin suerte :(Aunque veo que el proceso 'java.exe' accede a' persistence.xml'. Pude hacer que funcione como [esto] (http://pastebin.com/9bxWYQR3). Pero no estoy contento que especifique la ruta absoluta a .xml en el atributo 'propertiesFile'. ¿Podría decirme cómo puedo hacerlo funcionar especificando solo el nombre del archivo y definiendo la ruta de clase adicional en otra parte? Intenté algunas opciones pero no funcionó :(¡Gracias! – expert