java maven-2 openejb

java - ¿Cómo hacer que Maven ignore mi main/resources/persistence.xml a favor de test/...?



maven-2 openejb (4)

Creo que puedes crear dos perfiles en tu pom.xml:

<properties> <environment>dev</environment> </properties> <profiles> <profile> <id>prod</id> <properties> <environment>test</environment> </properties> </profile> </profiles>

Después de eso, en su carpeta src, cree dos carpetas llamadas dev / resoruces y test / resources y copie sus diferentes recursos allí. Después de eso, agrega algo como esto:

<resources> <resource> <directory>${basedir}/src/main/resources</directory> <filtering>false</filtering> </resource> <resource> <directory>${basedir}/src/main/${environment}/resources</directory> <filtering>true</filtering> </resource> </resources>

El $ {basedir} depende del parámetro de línea de comando, puede ser test o dev. Ejecuta el comando maven así: mvn clean package -P test .

Tengo dos archivos persistence.xml , por el bien de la prueba:

  • src/main/resources/META-INF/persistence.xml
  • src/test/resources/META-INF/persistence.xml

¿Cómo hacer que Maven ignore el primer archivo durante la prueba? Ahora no se ignora ya que OpenEJB dice:

ERROR - FAIL ... Finder: @PersistenceContext unitName has multiple matches: unitName "abc" has 2 possible matches.


Echa un vistazo a la funcionalidad de descriptores alternativos que está dirigida a lo que estás tratando de hacer.

Prueba esta configuración:

  • src/main/resources/META-INF/persistence.xml
  • src/main/resources/META-INF/test.persistence.xml

Luego, puede construir OpenEJB para preferir el archivo test.persistence.xml configurando la openejb.altdd.prefix System o InitialContext para test

Una posible solución diferente podría ser anular las propiedades de la unidad de persistencia en la prueba . Con ese enfoque, podría evitar la necesidad de un segundo persistence.xml que puede ser bueno, ya que mantener dos puede ser un dolor.

Puede utilizar el enfoque de Maven, pero tenga en cuenta que, según la especificación, el proveedor de persistencia solo buscará (en el análisis) frijoles @Entity en el @Entity o directorio exacto donde se encuentra el @Entity persistence.xml . Así que ten en cuenta que en Maven estas son dos ubicaciones diferentes:

  • target/classes
  • target/test-classes

EDITAR Más detalles sobre las capacidades de anulación

Puede anular cualquier propiedad en la configuración de prueba a través de las propiedades del sistema o las propiedades de contexto iniciales (esto incluye los archivos jndi.properties). El formato es:

<unit-name>.<property>=<value>

Así, por ejemplo, con el siguiente persistence.xml :

<persistence> <persistence-unit name="movie-unit"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>movieDatabase</jta-data-source> <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.max_fetch_depth" value="3"/> </properties> </persistence-unit> </persistence>

Puede anular y agregar propiedades de unidad de persistencia en su caso de prueba. Actualmente no hay instalaciones para eliminarlos (si necesita hacerlo, háganoslo saber, realmente no ha llegado hasta ahora).

Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory"); p.put("movie-unit.hibernate.hbm2ddl.auto", "update"); p.put("movie-unit.hibernate.dialect", "org.hibernate.dialect.HSQLDialect"); context = new InitialContext(p);

O alternativamente a través de un archivo jndi.properties

java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory movie-unit.hibernate.hbm2ddl.auto = update movie-unit.hibernate.dialect = org.hibernate.dialect.HSQLDialect


He estado probando estas y otras soluciones similares sin involucrar el pom.xml ... En mi opinión, la mejor manera de resolver este problema es tener dos application-context.xml (uno solo para usar en las clases de prueba) y agregue un bean administrador de unidad de persistencia personalizado en la aplicación-contexto.xml. Como este ejemplo:

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> <property name="persistenceXmlLocation"> <value>classpath*:META-INF/test.persistence.xml</value> </property> <property name="defaultDataSource" ref="dataSource"/> </bean>

Esta solución se ejecuta. :)


Mejor agregue ambos archivos, en general, hacer una prueba / producción o depuración / perfil / producción de distinción en la construcción solo genera problemas. Es mejor tratar de usar un nombre de unidad de perasistencia diferente para producción (por ejemplo, abc-production) y para pruebas (abc-tests).