本样例工程演示了如何借助 Maven 插件将一个 Spring Boot Web 工程打包成标准格式规范的可执行 Ark 包。
前提条件
样例工程依赖 sample-ark-plugin,您需要提前在本地安装该 Ark Plugin。
使用工具
SOFAArk 默认提供了 Maven 插件 sofa-ark-maven-plugin,您只需通过简单的配置,即可将普通的 Java 工程打包成标准格式规范的 Ark Plugin,插件坐标为:
<plugin>
     <groupId>com.alipay.sofa</groupId>
     <artifactId>sofa-ark-maven-plugin</artifactId>
     <version>${sofa.ark.version}</version>
</plugin>更多插件使用信息,请参见 Ark 包。
操作步骤
- 创建 SpringBoot Web 工程。 - 前往 Spring 官网 下载一个标准的 Spring Boot Web 工程。 
- 引入 sample-ark-plugin。 - 在工程主 - pom.xml中添加另一个样例工程打包生成的 Ark Plugin 依赖,详情请参见 如何打包 Ark Plugin。配置参考如下:- <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>sample-ark-plugin</artifactId> <classifier>ark-plugin</classifier> <version>${sofa.ark.version}</version> </dependency>
- 配置打包插件。 - 在工程主 - pom.xml中配置 Maven 插件 sofa-ark-maven-plugin,配置参考如下:- <build> <plugins> <plugin> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-maven-plugin</artifactId> <executions> <execution> <id>default-cli</id> <!--goal executed to generate executable-ark-jar --> <goals> <goal>repackage</goal> </goals> <configuration> <!--specify destination where executable-ark-jar will be saved, default saved to ${project.build.directory}--> <outputDirectory>./target</outputDirectory> <!--default none--> <arkClassifier>executable-ark</arkClassifier> </configuration> </execution> </executions> </plugin> </plugins> </build>- 在该样例工程中,虽然只配置了一部分配置项,但已经足够生成一个可用的可执行 - Ark包。各配置项含义如下:- outputDirectory:使用- mvn package命令打包后,输出的 Ark 包文件存放目录。
- arkClassifier:指定发布的 Ark 包的 Maven 坐标包含的- classifier值,默认为空。
 重要- arkClassifier配置项默认值为空,如果不指定- classifier,上传到仓库的 JAR 包实际是一个可运行的 Ark 包。如果需要和普通的打包加以区分,您需要配置此项。
- 打包、安装、发布 Ark 包。 - 和普通的工程操作类似,您可以使用 - mvn package、- mvn install、- mvn deploy命令完成插件包的安装和发布。
- 运行 Ark 包。 - 您可以通过以下两种方式在 Ark 容器上启动工程应用: - 通过命令行启动 - 直接使用 - java -jar启动应用。
- 在 IDE 启动 - 在 IDE 启动应用时,需要额外添加依赖。 - Spring Boot 工程 - Spring Boot 工程需要添加如下依赖: - <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-springboot-starter</artifactId> <version>${sofa.ark.version}</version> </dependency>
- 普通 Java 工程 - 相较于 Spring Boot 工程,普通的 Java 工程需要添加另一个依赖: - <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-support-starter</artifactId> <version>${sofa.ark.version}</version> </dependency>- 除此之外,还需要在工程 - main方法最开始处,执行容器启动,如下所示:- public class Application{ public static void main(String[] args){ SofaArkBootstrap.launch(args); ... } }
 
 
- 运行测试用例。 - SOFAArk 提供了 - org.junit.runner.Runner的两个实现类:- ArkJUnit4Runner和- ArkBootRunner。两者分别用于集成 JUnit4 测试框架和 Spring Test。对于 TestNG 测试框架,提供了注解- @TestNGOnArk,对于任何 TestNG 测试用例,只有打有- @TestNGOnArk的测试用例才会运行在 Ark Container 之上,否则和普通用例一样。- ArkJUnit4Runner - ArkJUnit4Runner类似- JUnit4,使用注解- ArkJUnit4Runner,即可在 SOFAArk 容器之上运行普通的 JUnit4 测试用例。示例代码如下:- @RunWith(ArkJUnit4Runner.class) public class UnitTest{ @Test public void test(){ Assert.assertTrue(true); } }- ArkJUnit4Runner和- JUnit4使用基本完全一致,- JUnit4测试框架的其他特性都能够完全兼容。
- ArkBootRunner - ArkBootRunner类似- SpringRunner。可参考 Spring 官方文档 学习- SpringRunner的用法。为了能够在 SOFAArk 容器之上运行 Spring Boot 测试用例,只需要简单使用- @RunWith(ArkBootRunner.class)替代- @RunWith(SpringRunner.class)即可。示例代码如下:- @RunWith(ArkBootRunner.class) @SpringBootTest(classes = SpringbootDemoApplication.class) public class IntegrationTest { @Autowired private SampleService sampleService; @Test public void test() { Assert.assertTrue("A Sample Service".equals(sampleService.service())); } }- ArkBootRunner和- SpringRunner使用基本一致。
- TestNGOnArk - 注解 - @TestNGOnArk是 SOFAArk 提供给开发者用于标记哪些 TestNG 用例运行在 SOFAArk 之上,哪些只是普通的用例。例如:- @TestNGOnArk public class TestNGTest { public static final String TEST_CLASSLOADER = "com.alipay.sofa.ark.container.test.TestClassLoader"; @Test public void test() { ClassLoader tccl = Thread.currentThread().getContextClassLoader(); ClassLoader loader = this.getClass().getClassLoader(); Assert.assertTrue(tccl.equals(loader)); Assert.assertTrue(tccl.getClass().getCanonicalName().equals(TEST_CLASSLOADER)); } }- 上述用例打了 - @TestNGTest,因此在执行该测试用例时,会先启动 Ark Container。