我需要多个配置文件进行部署。在Maven POM中,我定义了一个配置文件“dev”和一个属性“theHost”(作为localhost):
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault> <!-- use dev profile by default -->
</activation>
<build>
</build>
<properties>
<theHost>localhost</theHost>
</properties>
</profile>
...
我已经在maven-ejb-plugin上激活了filterDeploymentDescriptor
,以告诉它在ejb-jar.xml中过滤(替换)值:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.3</version>
<configuration>
<ejbVersion>3.1</ejbVersion>
--> <filterDeploymentDescriptor>true</filterDeploymentDescriptor>
</configuration>
</plugin
最后,在ejb-jar.xml中,我引用${theHost}
来获取@Resource属性“host”所需的特定于配置文件的值:
<session>
<ejb-name>MongoDao</ejb-name>
<ejb-class>com.coolcorp.MongoDao</ejb-class>
<session-type>Stateless</session-type>
<env-entry>
<env-entry-name>host</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>${theHost}</env-entry-value>
</env-entry>
...
这一切都适用于常规的Maven构建。但是当我使用GlassFish的嵌入式企业Bean容器[EJBContainer.createEJBContainer()]运行EJB单元测试时,maven-ejb-plugin似乎忽略了filterDeploymentDescriptor = true。 EJB看到“$ {theHost}”而不是“localhost”,尽管我使用相同的“dev”配置文件运行maven。
mvn.bat -Pdev test
有人知道为什么在运行单元测试时替换不起作用?是否还有一些我必须特别为单元测试定义的内容,以便过滤ejb-jar.xml?如果存在不同的配置文件,还是更好的单元测试EJB方法?
答案 0 :(得分:0)
理想情况下,您可以指定外部&#34;绑定&#34;为env入口。我知道可以使用WebSphere Application Server(通过EnvEntry.Value properties),但我不知道Glassfish是否可以实现。
作为一种解决方法,您可以声明注入的env条目,然后在PostConstruct中检查容器是否注入了任何值(即,在您注意之前不要指定env-entry-value)部署到服务器)。如果您只使用JNDI,则可以使用try / catch(NameNotFoundException)执行相同的操作。
@Resource(name="host")
private String host;
@PostConstruct
public void postConstruct() {
if (host == null) {
// Not configured at deployment time.
host = System.getProperty("test.host");
}
}
答案 1 :(得分:0)
基于bkail建议的解决方法:仅为单元测试设置系统属性并在postConstruct中发现它:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.14.1</version>
<configuration>
<skip>false</skip>
<argLine>-Xmx1g -XX:MaxPermSize=128m</argLine>
<reuseForks>false</reuseForks> <!-- with reuse the EJB timer service would fail -->
<systemPropertyVariables>
<is.unittest>true</is.unittest>
</systemPropertyVariables>
</configuration>
</plugin>
然后在使用@PostConstruct注释的Java方法中:
// Override values that were not substituted in ejb-jar.xml
if (Boolean.getBoolean("is.unittest")) {
host = "localhost";
port = "27017";
authenticationRequired = false;
}