Ark 包

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

    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 插件配置模板如下:

    配置项含义如下:

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

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

    • skip: 是否跳过执行 goal:repackage,默认为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。

    构建

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

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

    在工程主 pom 中配置仓库地址,然后敲击 mvn deploy命令,即可发布该 Ark 包;需要强调的是,如果设置了 attachtrueArk 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. └── sofa
    33. ├── bootstrap
    34. ├── ArkLauncher.class
    35. ├── ClasspathLauncher$ClassPathArchive.class
    36. ├── ClasspathLauncher.class
    37. ├── ContainerClassLoader.class
    38. ├── EntryMethod.class
    39. ├── ExecutableArchiveLauncher.class
    40. ├── Launcher.class
    41. ├── MainMethodRunner.class
    42. └── SofaArkBootstrap.class
    43. ├── loader
    44. ├── DirectoryBizModuleArchive.class
    45. ├── ExecutableArkBizJar$1.class
    46. ├── ExecutableArkBizJar$2.class
    47. ├── ExecutableArkBizJar$3.class
    48. ├── ExecutableArkBizJar.class
    49. ├── JarBizModuleArchive$1.class
    50. ├── JarBizModuleArchive.class
    51. ├── JarContainerArchive$1.class
    52. ├── JarContainerArchive.class
    53. ├── JarPluginArchive$1.class
    54. ├── JarPluginArchive.class
    55. ├── archive
    56. ├── data
    57. └── jar
    58. └── spi
    59. └── archive

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

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

    可以看到,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/plugin : 存放应用依赖的所有 Ark Plugin 包,demo 工程只依赖一个 rpc Ark Plugin