官方提供 Maven
插件 sofa-ark-maven-plugin
可以将普通 Java 工程或者 Spring Boot 工程打包成标准格式 Ark 包
;基于 Fat Jar 技术,使用 java -jar
命令可以直接启动 Ark 包
。 Maven
插件坐标为:
Goals
sofa-ark-maven-plugin
插件提供 goal: repackage
, 可以将工程打包成可执行的 Ark 包
,如下配置:
<build>
<plugin>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-ark-maven-plugin</artifactId>
<version>0.2.0</version>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>repackage</goal>
</goals>
</excution>
</executions>
<configuration>
<!-- 配置信息 -->
</configuration>
</plugin>
</build>
完整的 sofa-ark-maven-plguin
插件配置模板如下:
配置项含义如下:
outputDirectory
: ark 包和 ark biz 的打包存放目录,默认为工程 build 目录;finalName
: 生成 ark 包文件名称,默认为 ${artifactId};skip
: 是否跳过执行 goal:repackage,默认为false;attach
: 是否打包、安装和发布 ark biz,详细参考 Ark Biz 文档,默认为false;bizClassifier
: 设置 ark biz 的 classifier,默认为 ark-biz;excludes
: 打包 ark biz 时,排除指定的包依赖;格式为: ${groupId:artifactId} 或者 ${groupIdclassifier};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 模块目录或应用根目录中敲击
mvn pacakge
命令,即可在配置的outputDirectory
目录中生成Ark 包
和Ark Biz
文件;默认命名分别为 Web 模块 和${artifactId}-ark-biz
; 也可以分别通过arkClassifier
和bizClassifier
设置 classifier;敲击mvn install
命令,则会安装Ark 包
到本地仓库,如果设置了attach
为true
, 会同时把ark biz
安装到本地仓库;
Ark 包典型目录结构
下面是一个普通的 Spring Boot Web
应用打包生成的 Ark 包
目录结构
.
├── META-INF
│ └── MANIFEST.MF
├── SOFA-ARK
│ ├── biz
│ │ └── sofa-boot-demo-web-1.0-SNAPSHOT-sofa-ark-biz.jar
│ ├── container
│ │ ├── META-INF
│ │ │ └── MANIFEST.MF
│ │ ├── com
│ │ │ └── alipay
│ │ │ └── sofa
│ │ │ └── ark
│ │ └── lib
│ │ ├── aopalliance-1.0.jar
│ │ ├── guava-16.0.1.jar
│ │ ├── guice-4.0.jar
│ │ ├── guice-multibindings-4.0.jar
│ │ ├── javax.inject-1.jar
│ │ ├── log4j-1.2.17.jar
│ │ ├── slf4j-api-1.7.21.jar
│ │ ├── slf4j-log4j12-1.7.21.jar
│ │ ├── sofa-ark-archive-0.1.0.jar
│ │ ├── sofa-ark-common-0.1.0.jar
│ │ ├── sofa-ark-container-0.1.0.jar
│ │ ├── sofa-ark-exception-0.1.0.jar
│ │ ├── sofa-ark-spi-0.1.0.jar
│ │ └── sofa-common-tools-1.0.11.jar
│ └── plugin
│ └── sofa-ark-rpc-plugin-2.2.5-ark-plugin.jar
└── com
└── sofa
└── ark
│ ├── ArkLauncher.class
│ ├── ClasspathLauncher$ClassPathArchive.class
│ ├── ClasspathLauncher.class
│ ├── ContainerClassLoader.class
│ ├── EntryMethod.class
│ ├── ExecutableArchiveLauncher.class
│ ├── Launcher.class
│ ├── MainMethodRunner.class
│ └── SofaArkBootstrap.class
├── loader
│ ├── DirectoryBizModuleArchive.class
│ ├── ExecutableArkBizJar$1.class
│ ├── ExecutableArkBizJar$2.class
│ ├── ExecutableArkBizJar$3.class
│ ├── ExecutableArkBizJar.class
│ ├── JarBizModuleArchive$1.class
│ ├── JarBizModuleArchive.class
│ ├── JarContainerArchive$1.class
│ ├── JarContainerArchive.class
│ ├── JarPluginArchive$1.class
│ ├── JarPluginArchive.class
│ ├── archive
│ ├── data
│ └── jar
└── spi
└── 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
容器依赖包,实际上是如下依赖包的解压目录;
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-ark-all</artifactId>
<version>0.2.0</version>
</dependency>
SOFA-ARK/biz
: 存放所有的Ark Biz
包,因为 demo 工程中没有依赖其他的Ark Biz
, 因此只有自身的Ark Biz