该样例工程演示了如何借助 插件将一个 Spring Boot Web 工程打包成标准格式规范的可执行 Ark 包;

因该样例工程依赖 , 因此需要提前在本地安装该 Ark Plugin

官方提供了 Maven 插件 - sofa-ark-maven-plugin ,只需要简单的配置项,即可将 Spring Boot Web 工程打包成标准格式规范的可执行 Ark 包,插件坐标为:

详细请参考插件使用文档

基于该样例工程,我们一步步描述如何将一个 Spring Boot Web 工程打包成可运行 Ark 包

在官网 下载一个标准的 Spring Boot Web 工程

引入 sample-ark-plugin

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>sample-ark-plugin</artifactId>
  4. <classifier>ark-plugin</classifier>
  5. <version>0.2.0</version>
  6. </dependency>

在工程主 pom.xml 中如下配置 Maven 插件 sofa-ark-maven-plugin :

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>com.alipay.sofa</groupId>
  5. <artifactId>sofa-ark-maven-plugin</artifactId>
  6. <executions>
  7. <execution>
  8. <id>default-cli</id>
  9. <!--goal executed to generate executable-ark-jar -->
  10. <goal>repackage</goal>
  11. </goals>
  12. <configuration>
  13. <!--specify destination where executable-ark-jar will be saved, default saved to ${project.build.directory}-->
  14. <outputDirectory>./target</outputDirectory>
  15. <!--default none-->
  16. <arkClassifier>executable-ark</arkClassifier>
  17. </configuration>
  18. </execution>
  19. </plugin>
  20. </plugins>
  21. </build>

在该样例工程中,我们只配置了一部分配置项,这已经足够生成一个可用的可执行 Ark 包,各配置项含义如下:

  • outputDirectory: mvn package 打包后,输出的 Ark 包文件存放目录;

  • arkClassifier: 指定发布的 Ark 包其 Maven 坐标包含的 classifier 值,默认为空;

关于 arkClassifier 配置项需要特别注意下,默认值为空;如果不指定 classifier ,上传到仓库的 Jar 包其实是一个可运行的 Ark 包;如果需要和普通的打包加以区分,需要配置该项值。

打包、安装、发布

和普通的工程操作类似,使用 mvn package , mvn install , mvn deploy 即可完成插件包的安装和发布;

  • Spring Boot 工程:Spring Boot 工程需要添加如下依赖即可:
  • 普通 Java 工程: 相较于 SpringBoot 工程,普通的 Java 工程需要添加另一个依赖:
  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>sofa-ark-support-starter</artifactId>
  4. <version>0.2.0</version>
  5. </dependency>

除此之外,还需要在工程 main 方法最开始处,执行容器启动,如下:

  1. public class Application{
  2. public static void main(String[] args) {
  3. SofaArkBootstrap.launch(args);
  4. }
  5. }

运行测试用例

SOFAArk 提供了 org.junit.runner.Runner 的两个实现类,ArkJUnit4RunnerArkBootRunner,分别用于集成 JUnit4 测试框架和 Spring Test;对于 TestNG 测试框架,提供了注解 ,对于任何 TestNG 测试用例,只有打有 @TestNGOnArk 的测试用例才会跑在 Ark Container 之上,否则普通用例一样。

ArkJUnit4Runner

ArkJUnit4Runner 类似 JUnit4,使用注解 ArkJUnit4Runner,即可在 SOFAArk 容器之上运行普通的 JUnit4 测试用例;示范代码如下:

ArkJUnit4Runner 和 使用基本完全一致,JUnit4 测试框架的其他特性都能够完全兼容,

ArkBootRunner

ArkBootRunner 类似 SpringRunner,参考学习 SpringRunner 的用法;为了能够在 SOFAArk 容器之上运行 Spring Boot 测试用例,只需要简单使用 @RunWith(ArkBootRunner.class) 替代 (SpringRunner.class) 即可;示范代码如下:

  1. @RunWith(ArkBootRunner.class)
  2. @SpringBootTest(classes = SpringbootDemoApplication.class)
  3. public class IntegrationTest {
  4. @Autowired
  5. private SampleService sampleService;
  6. @Test
  7. public void test() {
  8. Assert.assertTrue("A Sample Service".equals(sampleService.service()));
  9. }
  10. }

ArkBootRunnerSpringRunner 使用基本完全一致;

TestNGOnArk

  1. @TestNGOnArk
  2. public class TestNGTest {
  3. public static final String TEST_CLASSLOADER = "com.alipay.sofa.ark.container.test.TestClassLoader";
  4. @Test
  5. public void test() {
  6. ClassLoader tccl = Thread.currentThread().getContextClassLoader();
  7. ClassLoader loader = this.getClass().getClassLoader();
  8. Assert.assertTrue(tccl.equals(loader));
  9. Assert.assertTrue(tccl.getClass().getCanonicalName().equals(TEST_CLASSLOADER));
  10. }
  11. }

上述用例打了 ,因此在执行该测试用例时,会先启动 Ark Container。