全部产品
云市场

Ark 包

更新时间:2020-02-04 15:50:10

本文将介绍标准 Ark 包 的目录结构,以及如何使用官方插件 sofa-ark-maven-plugin 打包并发布 Ark 包

Maven 插件

官方提供 Maven 插件 sofa-ark-maven-plugin 可以将普通 Java 工程或者 Spring Boot 工程打包成标准格式 Ark 包。基于 Fat Jar 技术,使用 java -jar 命令可以直接启动 Ark 包Maven 插件坐标为:

  1. <plugin>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>sofa-ark-maven-plugin</artifactId>
  4. <version>${sofa.ark.version}</version>
  5. </plugin>

Goals 配置

sofa-ark-maven-plugin 插件提供 goal: repackage,可以将工程打包成可执行的 Ark 包,如下配置:

  1. <build>
  2. <plugin>
  3. <groupId>com.alipay.sofa</groupId>
  4. <artifactId>sofa-ark-maven-plugin</artifactId>
  5. <version>${sofa.ark.version}</version>
  6. <executions>
  7. <execution>
  8. <id>default-cli</id>
  9. <goals>
  10. <goal>repackage</goal>
  11. </goals>
  12. </execution>
  13. </executions>
  14. <configuration>
  15. <!-- 配置信息 -->
  16. </configuration>
  17. </plugin>
  18. </build>

完整配置模板

完整的 sofa-ark-maven-plguin 插件配置模板如下:

  1. <plugins>
  2. <plugin>
  3. <groupId>com.alipay.sofa</groupId>
  4. <artifactId>sofa-ark-maven-plugin</artifactId>
  5. <version>${sofa.ark.version}</version>
  6. <executions>
  7. <execution>
  8. <id>default-cli</id>
  9. <goals>
  10. <goal>repackage</goal>
  11. </goals>
  12. <configuration>
  13. <!--ark 包和 ark biz 的打包存放目录,默认为工程 build 目录-->
  14. <outputDirectory>./target</outputDirectory>
  15. <!--设置应用的根目录,用于读取 ${base.dir}/conf/ark/bootstrap.application 配置文件,默认为 ${project.basedir}-->
  16. <baseDir>./</baseDir>
  17. <!--生成 ark 包文件名称,默认为 ${artifactId}-->
  18. <finalName>demo-ark</finalName>
  19. <!--是否跳过执行 goal:repackage,默认为false-->
  20. <skip>false</skip>
  21. <!--是否打包、安装和发布 ark biz,详细参考 Ark Biz 文档,默认为false-->
  22. <attach>true</attach>
  23. <!--设置 ark 包的 classifier,默认为空-->
  24. <arkClassifier>ark</arkClassifier>
  25. <!--设置 ark biz 的 classifier,默认为 ark-biz-->
  26. <bizClassifier>ark-biz</bizClassifier>
  27. <!--设置 ark biz 的 biz name,默认为 ${artifactId}-->
  28. <bizName>demo-ark</bizName>
  29. <!--设置 ark biz 的 biz version,默认为 ${artifactId}-->
  30. <bizVersion>0.0.1</bizVersion>
  31. <!--设置 ark biz 的 启动优先级,值越小优先级越高,${artifactId}-->
  32. <priority>100</priority>
  33. <!--设置 ark biz 的启动入口,默认会搜索被打 org.springframework.boot.autoconfigure.SpringBootApplication 注解且含有 main 方法的入口类-->
  34. <mainClass>com.alipay.sofa.xx.xx.MainEntry</mainClass>
  35. <!--设置是否将 scope=provided 的依赖打包,默认为 false-->
  36. <packageProvided>false</packageProvided>
  37. <!--设置是否生成 Biz 包,默认为true-->
  38. <keepArkBizJar>true</keepArkBizJar>
  39. <!--针对 Web 应用,设置 context path,默认为 /-->
  40. <webContextPath>/</webContextPath>
  41. <!--打包 ark biz 时,排除指定的包依赖;格式为: ${groupId:artifactId} 或者 ${groupId:artifactId:classifier}-->
  42. <excludes>
  43. <exclude>org.apache.commons:commons-lang3</exclude>
  44. </excludes>
  45. <!--打包 ark biz 时,排除和指定 groupId 相同的包依赖-->
  46. <excludeGroupIds>
  47. <excludeGroupId>org.springframework</excludeGroupId>
  48. </excludeGroupIds>
  49. <!--打包 ark biz 时,排除和指定 artifactId 相同的包依赖-->
  50. <excludeArtifactIds>
  51. <excludeArtifactId>sofa-ark-spi</excludeArtifactId>
  52. </excludeArtifactIds>
  53. <!--打包 ark biz 时,配置不从 ark plugin 索引的类;默认情况下,ark biz 会优先索引所有 ark plugin 的导出类,
  54. 添加该配置后,ark biz 将只在ark biz内部加载该类,不再优先委托 ark plugin 加载-->
  55. <denyImportClasses>
  56. <class>com.alipay.sofa.SampleClass1</class>
  57. <class>com.alipay.sofa.SampleClass2</class>
  58. </denyImportClasses>
  59. <!--对应 denyImportClasses 配置,可以配置包级别-->
  60. <denyImportPackages>
  61. <package>com.alipay.sofa</package>
  62. <package>org.springframework.*</package>
  63. </denyImportPackages>
  64. <!--打包 ark biz 时,配置不从 ark plugin 索引的资源;默认情况下,ark biz 会优先索引所有 ark plugin 的导出资源,
  65. 添加该配置后,ark biz 将只在ark biz内部寻找该资源,不在从 ark plugin 查找-->
  66. <denyImportResources>
  67. <resource>META-INF/spring/test1.xml</resource>
  68. <resource>META-INF/spring/test2.xml</resource>
  69. </denyImportResources>
  70. </configuration>
  71. </execution>
  72. </executions>
  73. </plugin>
  74. </plugins>

配置项含义可以参考上述注释。

构建

以 Spring Boot Web 工程为例,为了生成标准的 Ark 包,操作步骤如下:

  1. 参考配置模板,在 Web 模块的 pom.xml 文件中配置 sofa-ark-maven-plugin 插件。
  2. 在 Web 模块目录或应用根目录中敲击 mvn pacakge 命令,即可在配置的 outputDirectory 目录中生成 Ark 包Ark Biz 文件。默认命名分别为 Web 模块 ${artifactId}${artifactId}-ark-biz。也可以分别通过 arkClassifierbizClassifier 设置 classifier。运行 mvn install 命令,则会安装 Ark 包 到本地仓库,如果设置了 attachtrue,会同时把 ark biz 安装到本地仓库。

发布

在工程主 pom 中配置仓库地址,然后敲击 mvn deploy命令,即可发布该 Ark 包。需要强调的是,如果设置了 attachtrueArk Biz 也会发布到仓库,此外 Ark Biz 发布包默认会带上 classifier = ark-biz,可以通过 bizClassifier 设置 ark biz 的 classifier。

Ark 包典型目录结构

如何打包 Ark 包 为例,普通的 Spring Boot Web 应用打包生成的 Ark 包 目录结构如下:

  1. .
  2. ├── META-INF
  3. └── MANIFEST.MF
  4. ├── SOFA-ARK
  5. ├── biz
  6. └── sofa-ark-sample-springboot-ark-0.6.0-ark-biz.jar
  7. └── container
  8. └── sofa-ark-all-0.6.0.jar
  9. ├── com
  10. └── alipay
  11. └── sofa
  12. └── ark
  13. ├── bootstrap
  14. ├── common
  15. ├── loader
  16. └── spi
  17. └── conf
  18. └── ark
  19. └── bootstrap.properties

上述目录结构相关文件和目录说明如下:

  • META-INF/MANIFEST.MF:记录 Ark 包元信息,其中最关键的信息是 Ark 包的启动入口类 Main-Class 。文件内容类似如下:
    1. Manifest-Version: 1.0
    2. web-context-path: /
    3. Archiver-Version: Plexus Archiver
    4. Built-By: qilong.zql
    5. Ark-Biz-Name: sofa-ark-sample-springboot-ark
    6. Sofa-Ark-Version: 0.6.0
    7. deny-import-packages:
    8. priority: 100
    9. Main-Class: com.alipay.sofa.ark.bootstrap.ArkLauncher
    10. deny-import-classes:
    11. Ark-Container-Root: SOFA-ARK/container/
    12. deny-import-resources:
    13. Ark-Biz-Version: 0.6.0
    14. Created-By: Apache Maven 3.2.5
    15. Build-Jdk: 1.8.0_101
    可以看到,Ark 包 启动入口类是 com.alipay.sofa.ark.bootstrap.ArkLauncher
  • com/alipay/sofa/ark/*:存放使用 java -jar 命令启动 Ark 包 所必需的引导类。
  • SOFA-ARK/container:存放 ark container 容器依赖包,实际上是下面的依赖包:
    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>sofa-ark-all</artifactId>
    4. <version>${sofa.ark.version}</version>
    5. </dependency>
  • SOFA-ARK/biz:存放所有的 Ark Biz 包,因为示例工程中没有依赖其他的 Ark Biz,因此只有自身的 Ark Biz
  • SOFA-ARK/plugin:在该示例工程中,没有生成这个目录,因为工程中没有依赖其他的 Ark Plugin
  • conf/ark/properties:SOFAArk 的容器配置文件,在该示例工程中,设置了 SOFAArk 日志生成路径。