如何指示Maven忽略我的main / resources / persistence.xml以支持test / ...?

时间:2010-10-05 10:39:33

标签: java maven-2 openejb

为了测试,我有两个persistence.xml个文件:

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

如何指示Maven在测试期间忽略第一个文件?现在它不会被忽视,因为OpenEJB说:

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

4 个答案:

答案 0 :(得分:11)

查看针对您要执行的操作的alternate descriptors功能。

尝试此设置:

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

然后,您可以通过将test.persistence.xml System或InitialContext属性设置为openejb.altdd.prefix

来构建OpenEJB以优先选择test文件

另一种可能的解决方案可能是override the persistence unit properties in the test。通过这种方法,您可以避免需要第二个persistence.xml,这可能很好,因为维持两个可能会很痛苦。

您可以使用Maven方法,但请注意,根据规范,持久性提供程序只会在找到@Entity的确切jar或目录中查找(aka扫描)persistence.xml个bean。所以要敏锐地意识到,在Maven中,这是两个不同的位置:

  • target/classes
  • target/test-classes

编辑有关覆盖功能的更多详细信息

您可以通过系统属性或初始上下文属性(包括jndi.properties文件)覆盖测试设置中的任何属性。格式为:

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

例如,使用以下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>

您可以在测试用例中覆盖添加持久性单元属性。目前没有任何设施可以移除它们(如果您有需要,请告诉我们 - 到目前为止还没有实现)。

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);

或者通过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

答案 1 :(得分:1)

我认为您可以在pom.xml中创建两个配置文件:

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

之后,在您的src文件夹中,创建两个名为dev / resoruces和test / resources的文件夹,并在那里复制您的不同资源。之后,添加如下内容:

<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>

$ {basedir}取决于命令行参数,它可以是test或dev。 您可以像这样运行maven命令: mvn clean package -P test

答案 2 :(得分:0)

我一直在测试这些和其他类似的解决方案而不涉及pom.xml ...在我看来,解决这个问题的最好方法是有两个application-context.xml(一个只用于测试类)并在测试的application-context.xml中添加自定义持久性单元管理器bean。像这个例子:

<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>

此解决方案运行。 :)

答案 3 :(得分:-2)

更好地添加两个文件 - 通常,在构建中进行测试/生产或调试/配置文件/生产区分只会带来麻烦。 最好尝试使用不同的perasistence单位名称进行生产(比如abc-production)和测试(abc-tests)。