如何打包 Ark 包

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

操作步骤

  1. 创建 SpringBoot Web 工程。

    前往 Spring 官网 下载一个标准的 Spring Boot Web 工程。

  2. 引入 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>
  3. 配置打包插件。

    在工程主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 包。如果需要和普通的打包加以区分,您需要配置此项。

  4. 打包、安装、发布 Ark 包。

    和普通的工程操作类似,您可以使用mvn packagemvn installmvn deploy 命令完成插件包的安装和发布。

  5. 运行 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);
                     ...
              }
        
        }
  6. 运行测试用例。

    SOFAArk 提供了org.junit.runner.Runner的两个实现类:ArkJUnit4RunnerArkBootRunner。两者分别用于集成 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);
          }
      }
      

      ArkJUnit4RunnerJUnit4使用基本完全一致,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()));
          }
      }

      ArkBootRunnerSpringRunner使用基本一致。

    • 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。