在我的项目中,我们创建了一个 Maven 模块来获取特定的 JBoss AS 并解压。
然后所有的测试用例都可以在这个Jboss AS作为嵌入式容器下运行。
我们使用 jboss-ejb3-embedded-standalone 来调用嵌入式容器,但是,它只是从环境变量中找到 JBOSS_HOME 并使用该容器来运行。
因此,我们必须在每次 mvn 安装时更新 JBOSS_HOME。
我尝试在 Maven 中通过引入 exec-maven-plugin 来做到这一点,如下所示:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<executable>env</executable>
<environmentVariables>
<JBOSS_HOME>
C:/Sample/embedded-container/jboss-${version.org.jboss.jbossas}
</JBOSS_HOME>
</environmentVariables>
</configuration>
<executions>
<execution>
<id>resetJbossHome</id>
<phase>integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
</plugin>
在控制台的输出中,我可以看到
[INFO] --- exec-maven-plugin:1.2.1:exec (resetJbossHome) @ test-embedded ---
....
JBOSS_HOME=C:/Sample/embedded-container/jboss-6.1.0.Final
....
但是启动 JBOSS 时,它仍然运行设置了 origin JBOSS_HOME 的 JBOSS。
此外,我也尝试过使用maven-antrun-plugin。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copyRelease</id>
<phase>pre-integration-test</phase>
<configuration>
<tasks>
<exec executable="env">
<env key="JBOSS_HOME" value="C:/Sample/embedded-container/jboss-${version.org.jboss.jbossas}"/>
</exec>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
结果是一样的。
我的配置错误还是有更好的方法?
查看 Maven 配置文件。
您可以定义一种用于测试的配置文件,一种用于生产的配置文件,具有不同的属性,例如
<profiles>
<profile>
<id>test</id>
<jboss.home>PATH TO JBOSS TEST INSTANCE</jboss.home>
</profile>
<profile>
<id>prod</id>
<jboss.home>PATH TO JBOSS PROD INSTANCE</jboss.home>
</profile>
</profiles>
在你的执行插件中:
<environmentVariables>
<JBOSS_HOME>
${jboss.home}
</JBOSS_HOME>
</environmentVariables>
来自您的评论之一:
在我的项目中,JUnit测试是由maven-failsafe-plugin启动的,并且在测试用例本身中将调用由jboss-ejb3-embedded-standalone jar实现的createEJBContainer方法,该方法将启动jboss作为容器。
Maven Failsafe 插件默认分叉一个进程,这意味着它将拥有自己的一组环境变量。将其
forkCount
配置设置为 0
以确保其在同一进程中运行。请参阅https://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html#forkCount
您还应该将
phase
设置为 pre-integration-test
,而不是 integration-test
,以确保 Failsafe 插件在完成后执行。