本小节将介绍标准 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>0.2.0</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>0.2.0</version>
  6. <executions>
  7. <execution>
  8. <id>default-cli</id>
  9. <goals>
  10. <goal>repackage</goal>
  11. </goals>
  12. </excution>
  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>0.1.0</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. <!--生成 ark 包文件名称,默认为 ${artifactId}-->
  16. <finalName>demo-ark</finalName>
  17. <!--是否跳过执行 goal:repackage,默认为false-->
  18. <skip>false</skip>
  19. <!--是否打包、安装和发布 ark biz,详细参考 Ark Biz 文档,默认为false-->
  20. <attach>true</attach>
  21. <!--设置 ark 包的 classifier,默认为空-->
  22. <arkClassifier>ark-classifier</arkClassifier>
  23. <!--设置 ark biz 的 classifier,默认为 ark-biz-->
  24. <bizClassifier>ark-biz-classifier</bizClassifier>
  25. <!--打包 ark biz 时,排除指定的包依赖;格式为: ${groupId:artifactId} 或者 ${groupId:artifactId:classifier}-->
  26. <excludes>
  27. <exclude>org.apache.commons:commons-lang3</exclude>
  28. </excludes>
  29. <!--打包 ark biz 时,排除和指定 groupId 相同的包依赖-->
  30. <excludeGroupIds>
  31. <excludeGroupId>org.springframework</excludeGroupId>
  32. </excludeGroupIds>
  33. <!--打包 ark biz 时,排除和指定 artifactId 相同的包依赖-->
  34. <excludeArtifactIds>
  35. <excludeArtifactId>sofa-ark-spi</excludeArtifactId>
  36. </excludeArtifactIds>
  37. <!--打包 ark biz 时,配置不从 ark plugin 索引的类;默认情况下,ark biz 会优先索引所有 ark plugin 的导出类,
  38. 添加该配置后,ark biz 将只在ark biz内部加载该类,不再优先委托 ark plugin 加载-->
  39. <denyImportClasses>
  40. <class>com.alipay.sofa.SampleClass1</class>
  41. <class>com.alipay.sofa.SampleClass2</class>
  42. </denyImportClasses>
  43. <!--对应 denyImportClasses 配置,可以配置包级别-->
  44. <denyImportPackages>
  45. <package>com.alipay.sofa</package>
  46. <package>org.springframework.*</package>
  47. </denyImportPackages>
  48. <!--打包 ark biz 时,配置不从 ark plugin 索引的资源;默认情况下,ark biz 会优先索引所有 ark plugin 的导出资源,
  49. 添加该配置后,ark biz 将只在ark biz内部寻找该资源,不在从 ark plugin 查找-->
  50. <denyImportResources>
  51. <resource>META-INF/spring/test1.xml</resource>
  52. <resource>META-INF/spring/test2.xml</resource>
  53. </denyImportResources>
  54. </configuration>
  55. </execution>
  56. </executions>
  57. </plugin>
  58. </plugins>

配置项含义如下:

  • outputDirectory: ark 包和 ark biz 的打包存放目录,默认为工程 build 目录;

  • finalName: 生成 ark 包文件名称,默认为 ${artifactId};

  • skip: 是否跳过执行 goal:repackage,默认为false;

  • attach: 是否打包、安装和发布 ark biz,详细参考 Ark Biz 文档,默认为false;

  • arkClassifier: 设置 ark 包的 classifier,默认为空;

  • bizClassifier: 设置 ark biz 的 classifier,默认为 ark-biz;

  • excludes: 打包 ark biz 时,排除指定的包依赖;格式为: ${groupId:artifactId} 或者 ${groupId:artifactId:classifier};

  • excludeGroupIds: 打包 ark biz 时,排除和指定 groupId 相同的包依赖;

  • excludeArtifactIds: 打包 ark biz 时,排除和指定 artifactId 相同的包依赖;

  • denyImportClasses: 打包 ark biz 时,配置不从 ark plugin 索引的类;默认情况下,ark biz 会优先索引所有 ark plugin 的导出类,添加该配置后,ark biz 将只在ark biz内部加载该类,不再优先委托 ark plugin 加载;

  • denyImportPackages: 对应 denyImportClasses 配置,可以配置包级别; 需要注意的是,如果包名末尾带通配符 *, 则以该包名为前缀的子包都会被deny。如果包名末尾不带通配符 *,则只有以该包名为前缀的类才会被deny。

  • denyImportResources: 打包 ark biz 时,配置不从 ark plugin 索引的资源;默认情况下,ark biz 会优先索引所有 ark plugin 的导出资源, 添加该配置后,ark biz 将只在ark biz内部寻找该资源,不在从 ark plugin 查找

构建

以 Spring Boot Web 工程为例,为了生成标准的 Ark 包 ,只需要两步操作

  • 参考配置模板,在 Web 模块的 pom.xml 文件中配置 sofa-ark-maven-plugin 插件;
  • 在 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 包典型目录结构

下面是一个普通的 Spring Boot Web 应用打包生成的 Ark 包 目录结构

  1. .
  2. ├── META-INF
  3. └── MANIFEST.MF
  4. ├── SOFA-ARK
  5. ├── biz
  6. └── sofa-boot-demo-web-1.0-SNAPSHOT-sofa-ark-biz.jar
  7. ├── container
  8. ├── META-INF
  9. └── MANIFEST.MF
  10. ├── com
  11. └── alipay
  12. └── sofa
  13. └── ark
  14. └── lib
  15. ├── aopalliance-1.0.jar
  16. ├── guava-16.0.1.jar
  17. ├── guice-4.0.jar
  18. ├── guice-multibindings-4.0.jar
  19. ├── javax.inject-1.jar
  20. ├── log4j-1.2.17.jar
  21. ├── slf4j-api-1.7.21.jar
  22. ├── slf4j-log4j12-1.7.21.jar
  23. ├── sofa-ark-archive-0.1.0.jar
  24. ├── sofa-ark-common-0.1.0.jar
  25. ├── sofa-ark-container-0.1.0.jar
  26. ├── sofa-ark-exception-0.1.0.jar
  27. ├── sofa-ark-spi-0.1.0.jar
  28. └── sofa-common-tools-1.0.11.jar
  29. └── plugin
  30. └── sofa-ark-rpc-plugin-2.2.5-ark-plugin.jar
  31. └── com
  32. └── alipay
  33. └── sofa
  34. └── ark
  35. ├── bootstrap
  36. ├── ArkLauncher.class
  37. ├── ClasspathLauncher$ClassPathArchive.class
  38. ├── ClasspathLauncher.class
  39. ├── ContainerClassLoader.class
  40. ├── EntryMethod.class
  41. ├── ExecutableArchiveLauncher.class
  42. ├── Launcher.class
  43. ├── MainMethodRunner.class
  44. └── SofaArkBootstrap.class
  45. ├── loader
  46. ├── DirectoryBizModuleArchive.class
  47. ├── ExecutableArkBizJar$1.class
  48. ├── ExecutableArkBizJar$2.class
  49. ├── ExecutableArkBizJar$3.class
  50. ├── ExecutableArkBizJar.class
  51. ├── JarBizModuleArchive$1.class
  52. ├── JarBizModuleArchive.class
  53. ├── JarContainerArchive$1.class
  54. ├── JarContainerArchive.class
  55. ├── JarPluginArchive$1.class
  56. ├── JarPluginArchive.class
  57. ├── archive
  58. ├── data
  59. └── jar
  60. └── spi
  61. └── archive

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

  • META-INF/MANIFEST.MF : 记录 Ark 包元信息,其中最关键的信息是 Ark 包的启动入口类 Main-Class ;文件内容类似如下:

    1. Manifest-Version: 1.0
    2. Implementation-Title: sofa-ark-all
    3. Implementation-Version: 0.1.0
    4. Archiver-Version: Plexus Archiver
    5. Built-By: qilong.zql
    6. Sofa-Ark-Version: 0.1.0
    7. Specification-Title: sofa-ark-all
    8. Implementation-Vendor-Id: com.alipay.sofa
    9. Main-Class: com.alipay.sofa.ark.bootstrap.ArkLauncher
    10. Ark-Container-Root: SOFA-ARK/container/
    11. Created-By: Apache Maven 3.2.5
    12. Build-Jdk: 1.8.0_101
    13. Specification-Version: 0.1.0
    14. ArkVersion: 0.1.0
    15. Timestamp: 2018-03-13T18:13:06Z

    可以看到,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>0.2.0</version>
  5. </dependency>
  • SOFA-ARK/biz : 存放所有的 Ark Biz 包,因为 demo 工程中没有依赖其他的 Ark Biz , 因此只有自身的 Ark Biz

  • SOFA-ARK/plugin : 存放应用依赖的所有 Ark Plugin 包,demo 工程只依赖一个 rpc Ark Plugin