本样例工程演示了如何借助 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。