有没有办法在Maven项目中设置第二个persistence.xml文件,以便将其用于测试而不是用于部署的普通文件?
我尝试在src/test/resources/META-INF中放置一个类,它会被复制到persistence.xml /test-classes/META-INF中,但是似乎首选目标/classes/META-INF(来自src/main/resources的副本),尽管mvn -X test
以正确的顺序列出了类路径条目:
[DEBUG] Test Classpath :
[DEBUG] /home/uqpbecke/dev/NetBeansProjects/UserManager/target/test-classes
[DEBUG] /home/uqpbecke/dev/NetBeansProjects/UserManager/target/classes
[DEBUG] /home/uqpbecke/.m2/repository/junit/junit/4.5/junit-4.5.jar
...
我希望能够对简单的hsqldb配置运行测试,而不必更改JPA配置的部署版本,理想情况下,直接在项目签出后运行,而不需要任何本地调整。
发布于 2009-07-24 20:01:14
下面的方法将适用于Maven 2.1+ (在此之前,在测试和包之间没有可以绑定执行的阶段)。
您可以使用maven-antrun-plugin在测试期间将persistence.xml替换为测试版本,然后在打包项目之前恢复正确的版本。
此示例假设生产版本为src/main/resources/META-INF/persistence.xml,测试版本为src/ test /resources/META-INF/persistence.xml,因此它们将分别复制到target/classes/META-INF和target/test-classes/META-INF。
将其封装到mojo中会更优雅,但由于您只复制一个文件,这似乎有点过头了。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>copy-test-persistence</id>
<phase>process-test-resources</phase>
<configuration>
<tasks>
<!--backup the "proper" persistence.xml-->
<copy file="${project.build.outputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml.proper"/>
<!--replace the "proper" persistence.xml with the "test" version-->
<copy file="${project.build.testOutputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>restore-persistence</id>
<phase>prepare-package</phase>
<configuration>
<tasks>
<!--restore the "proper" persistence.xml-->
<copy file="${project.build.outputDirectory}/META-INF/persistence.xml.proper" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
发布于 2010-06-01 19:55:40
在EE6/CDI/JPA项目中,不需要任何进一步的配置就可以很好地获取测试src/test/resources/META-INF/persistence.xml
。
在Spring中使用JPA时,以下内容适用于用于测试的应用程序上下文:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--
JPA requires META-INF/persistence.xml, but somehow prefers the one
in classes/META-INF over the one in test-classes/META-INF. Spring
to the rescue, as it allows for setting things differently, like by
referring to "classpath:persistence-TEST.xml". Or, simply referring
to "META-INF/persistence.xml" makes JPA use the test version too:
-->
<property name="persistenceXmlLocation" value="META-INF/persistence.xml" />
<!-- As defined in /src/test/resources/META-INF/persistence.xml -->
<property name="persistenceUnitName" value="myTestPersistenceUnit" />
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
</property>
</bean>
在这里,/src/test/resources/META-INF/persistence.xml
(复制到target/test-classes
)比/src/main/resources/META-INF/persistence.xml
(复制到target/classes
)更可取。
不幸的是,persistence.xml
文件的位置也决定了所谓的"persistence unit's root",然后它决定了扫描哪些类来查找@Entity
注释。因此,使用/src/test/resources/META-INF/persistence.xml
将扫描target/test-classes
中的类,而不是target/classes
中的类(需要测试的类将位于其中)。
因此,为了进行测试,需要显式地将<class>
条目添加到persistence.xml
中,以避免java.lang.IllegalArgumentException: Not an entity: class ...
。可以通过使用不同的文件名(如persistence-TEST.xml
)来避免需要<class>
条目,并将该文件放在与常规persistence.xml
文件完全相同的文件夹中。然后,测试文件夹中的Spring context可以直接引用<property name="persistenceXmlLocation" value="META-INF/persistence-TEST.xml" />
,Spring将在src/main
中为您找到它。
作为另一种选择,可以在实际应用程序和测试中保持persistence.xml
相同,并且只在src/main
中定义一个。大多数配置,如驱动程序、方言和可选凭据,都可以在Spring上下文中完成。此外,诸如hibernate.hbm2ddl.auto
之类的设置也可以为passed in the context
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- For example: com.mysql.jdbc.Driver or org.h2.Driver -->
<property name="driverClassName" value="#{myConfig['db.driver']}" />
<!-- For example: jdbc:mysql://localhost:3306/myDbName or
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 -->
<property name="url" value="#{myConfig['db.url']}" />
<!-- Ignored for H2 -->
<property name="username" value="#{myConfig['db.username']}" />
<property name="password" value="#{myConfig['db.password']}" />
</bean>
<bean id="jpaAdaptor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- For example: org.hibernate.dialect.MySQL5Dialect or
org.hibernate.dialect.H2Dialect -->
<property name="databasePlatform" value="#{myConfig['db.dialect']}" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="jpaProperties">
<props>
<!-- For example: validate, update, create or create-drop -->
<prop key="hibernate.hbm2ddl.auto">#{myConfig['db.ddl']}</prop>
<prop key="hibernate.show_sql">#{myConfig['db.showSql']}</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
发布于 2008-12-22 05:34:30
多个persistence.xml文件似乎是JPA的一个普遍问题,只有通过类加载技巧才能解决。
我的一个变通方法是在一个persistence.xml文件中定义多个持久化单元,然后确保您的部署和测试代码使用不同的绑定(在Spring中,您可以在实体管理器工厂上设置"persistenceUnitName“属性)。它会用测试配置污染您的部署文件,但是如果您不介意它正常工作的话。
https://stackoverflow.com/questions/385532
复制相似问题