HarmonyOS 私仓搭建
1. HarmonyOS 私仓搭建
私仓搭建文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-ohpm-repo-quickstart-V5

发布共享包[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-har-publish-0000001597973129-V5]

1.1. 说明
在Android和iOS开发中很多时候都以以二进制的产物的方式进行依赖和协作,Android基于Mave为仓库,iOS有Pod为仓库,我们可以在官方提供的的平台使用别人开放的库,极大的提高了大家的开发效率。但是有些公司业务相关的库并不想被外部人员使用,上传到外部共有的仓库就不是很安全,很多公司在内部搭建了私有仓库,一方面更加安全,另一方面平时推拉产物也更快。
鸿蒙也是同样的问题,我们可以方便的在官方仓库平台使用三方开放的产物,但是公司内部业务还是需要依赖私有仓库,本文基于官方提供的工具搭建属于自己的私有仓库。
本文介绍了鸿蒙平台私仓搭建以及私仓共享包依赖与发布流程,并介绍了工模块依赖的复杂应用场景一键打包上传的场景实践。
1.2. 鸿蒙共享包介绍
鸿蒙共享包分静态共享包和动态共享包:
HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
HSP(Harmony Shared Package)是动态共享包,静态共享包会打包到每个依赖的HAP里,这样导致包体积较大,且有重复多份公共资源和代码重复打包到应用中,动态共享包可以让多个HAP能够共享同一公共资源代码。HSP只支持在应用内共享,不支持跨应用共享
1.3. ohpm-repo私仓工具搭建私仓
官方提供了ohpm-repo工具帮助开发者快速搭建轻量级的ohpm私有仓库,与 ohpm 包管理器兼容,并按需缓存所有依赖项,加速私有网络中的安装。
ohpm-repo 支持单点部署和多实例部署:
(1)单点部署:ohpm-repo 仅部署在一台机器上使用。
(2)多实例部署:ohpm-repo 会部署到多台机器中,具有相同的配置内容,并且共享数据存储空间。
1.3.1. 依赖环境安装
ohpm-repo 依赖于 node 运行,支持 node.js 16.x 及以上版本,需要先安装 nodejs,并进行环境配置。NodeJs安装可以从官网(https://nodejs.org/download/release/latest/)下载。
1.3.2. 下载ohpm-repo工具
(1)下载ohpm-repo工具,下载地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-software-download-0000001507075446
(2)解压ohpm-repo工具
1.3.3. 配置ohpm-repo环境变量
将ohpm-repo工具包解压目录中bin目录的路径配置到系统环境变量path中:export PATH= O H P M − R E P O − P A T H / b i n : OHPM-REPO-PATH/bin: OHPM−REPO−PATH/bin:PATH
执行命令ohpm-repo -v查看版本号,验证解压包完整无损
1.3.4. ohpm-repo服务配置文件配置
进入解压目录的conf目录,打开config.yaml文件,默认配置如下:
##### server configuration section #####
listen: localhost:8088 # 建议修改为具体的ip/域名
# listen:
# - localhost:8088 # 监听本机环回地址
# - http://localhost:8088 # 监听本机环回地址
# - 0.0.0.0:8088 # 监听本机所有地址 (INADDR_ANY)
# 协议可配置 http 或者 https,默认为 http
# port: 1-65535(Window系统)/ 1024-65535(Linux或Mac系统)# 可选 (listen 为 https 协议时必须配置)
https_key: '' # https 服务使用的 key 的路径 (不配置默认为'')
https_cert: '' # https 服务使用的 crt 的路径 (不配置默认为'')##### server deploy root section #####
deploy_root: '' # 安装根目录 (不配置默认为 `<现有用户home目录>/ohpm-repo`),只支持绝对路径,且路径目录必须存在##### server numeric limit section #####
max_package_size: 300 # 上传包大小限制,单位是MB (0, 300],不配置默认为 300
max_extract_size: 800 # 压缩包解压后大小限制,单位是MB ,不配置默认为 800
max_extract_file_num: 30000 # 压缩包解压后文件个数限制,默认为30000个
user_rate_limit: 100 # 用户访问频率控制,单位是次/s (0, 10000],不配置默认为 100
fetch_timeout: 60 # 请求/响应的超时时间,单位是秒 (0, 3600],不配置默认为 60
keep_alive_timeout: 60 # TCP 保持连接的超时时间,单位是秒 (0, 3600],不配置默认为 60
api_timeout: 60 # api超时时间,单位是秒(0, 3600],不配置默认为 60
upload_lock_hour: 24 # 下架某一三方包所有版本后,限时禁止同名三方包上传,单位是小时 (0, 168],不配置,默认为 24
upload_max_times: 100 # 单用户24小时内上传次数限制 (0, 100000],不配置默认为 100
operation_log_retention: 100 # 数据库中操作日志保留时间,单位是天,不配置默认为 100
##### metadata storage section #####
## 数据存储类型 filedb 和 mysql 二选一,不可都配置
db: # 必须用 yaml 数组形式写法type: filedbconfig: # 如果想修改存储路径且保留旧的数据,则需要把旧路径下的数据文件迁移至新路径path: ./db # 本地数据存储路径,不配置默认为<deploy_root>/db;#db: # 必须用yaml数组形式写法
# type: mysql
# config:
# host: "localhost" # 数据库主机地址
# port: 3306 # 数据库端口 (0,65535]
# username: tctAdmin # 数据库的用户名
# password: "password" # 数据库的用户密码(请配置明文, 最终在部署目录中会转换为密文)
# database: "repo" # 数据库名##### storage section #####
## 文件存储类型fs,sftp 和 custom 三选一,不可多选。store: # 必须用 yaml 数组形式写法type: fsconfig: # 上传资源后如若要修改存储路径,则需要把旧路径下的数据迁移至新路径中path: ./storage # 已上架三方库存储路径,不配置默认为 <deploy_root>/storage;#server: http://localhost:8088 # 仓库下载链接地址,不配置取默认值# 文件存储类型为 sftp 时,最多配置三个 sftp
#store: # 必须用 yaml 数组形式写法
# type: sftp # 当且仅当 db 的类型为 mysql 时,store 的类型才能为 sftp
# config:
# location:
# -
# name: test_one_sftp # 主机名字名字不能与其他sftp配置重复
# host: "localhost" # 主机地址
# port: 22 # 主机端口 (0,65535]
# read_username: "read" # 主机有读权限的用户名字
# read_password: "password" # 主机有读权限的用户密码(请配置明文, 最终在部署目录中会转换为密文)
# write_username: "write" # 主机有写权限的用户名字
# write_password: "password" # 主机有写权限的用户密码(请配置明文, 最终在部署目录中会转换为密文)
# path: /source22 # 相对 sftp 根目录的文件路径,仅限/开头,且路径文件夹必须存在
# -
# name: test_two_sftp
# host: "localhost"
# port: 24
# read_username: "read"
# read_password: "password"
# write_username: "write"
# write_password: "password"
# path: /source24
# #server: http://localhost:8088 # 仓库下载链接地址,不配置取默认值#store:
# type: custom # custom是自定义存储插件类型,自定义存储插件开发流程见指导文档
# config:
# export_name: CustomStorage # 插件export的类名
# plugin_path: plugins/CustomStorage.js # 插件的绝对路径或者相对于ohpm-repo软件包的路径,建议将插件放在软件包的plugins目录下
# custom_field: "test" # 自定义字段,通过引入libs/common/getStorageConfigInfo.js的getStorageConfigInfo方法获取自定义字段的值
# #server: http://localhost:8088 # 仓库下载链接地址,不配置取默认值
##### 是否使用反向代理 #####
# 可选项:true,false, 默认:false。如果使用反向代理,需要配置为true,客户端IP地址将从请求头中的x-forwarded-for字段获取
use_reverse_proxy: false
##### uplink section #####
uplink_cache_path: ./uplink # 缓存路径,不配置默认为 <deploy_root>/uplink
uplink_cache_time: 168 # 远程包 metadata 缓存时间,单位为小时,默认 168 小时,取值范围为 (0, 8760]##### log section #####
logs_path: ./logs # 日志路径,不配置默认为 <deploy_root>/logs##### log level section #####
# 日志级别: 级别由低到高分别是 all、trace、debug、info、warn、error、fatal、mark、off
# run,operate 和 access 不配置或者配置错误,默认为 info
loglevel_run: info
loglevel_operate: info
loglevel_access: info##### auth plugin section #####
# 可选项,自定义认证插件配置
#auth_plugin:
# name: CustomAuth # 认证插件的名字
# path: plugins/CustomAuth.js # 插件的绝对路径或者相对于ohpm-repo软件包的路径,建议将插件放在软件包的plugins目录下##### compatibleSdkVersion等兼容性字段检测日志等级 #####
# 可选值:close、info、warn、error,默认:warn
compability_log_level: warn##### 是否允许下架被其他组件依赖的包 #####
# 可选项:true,false, 默认:false
allow_remove_depended_packages: false##### 是否使用文件上传新接口 #####
# 可选项:true,false, 默认:true
allow_new_file_upload_api: true
包含监听端口、https配置、私仓部署目录deploy_root、服务相关配置server、存储配置db、日志logs等,按照实际情况配置即可。
关于存储模块:
db是元数据存储的配置项,db支持fileDB本地存储和mysql数据库存储
store是文件存储的配置项,store支持local storage本地存储,sftp storage存储和custom storage 自定义插件存储。
1.3.5. 私仓成功启动后修改配置文件方法:
首次启动私仓时执行install命令指定配置文件:找到指定的配置文件进行文件内容修改,然后重新执行install指定修改后的配置文件,再执行start启动私仓。
首次启动私仓时执行install命令未指定配置文件:默认使用私仓压缩包解压路径下conf目录中的配置文件,修改该文件内容,然后重新执行install和start操作。
1.3.6. 安装启动
执行ohpm-repo install安装,安装完成后根据配置设置环境变量,设置完成后执行ohpm-repo start启动服务。
1.4. 使用私仓共享包
默认情况客户端ohpm工具,拉取依赖包只会从官方公开仓库拉取,想从私仓拉取需要进行额外的配置,配置方式有两种:
(1)为所有项目配置该私有仓:1. ohpm config set registry <配置的私仓服务地址>/repos/ohpm
(2)针对某次依赖安装配置:1. ohpm install @ohos/lottie --registry <配置的私仓服务地址>/repos/ohpm
上面配置的私仓服务地址是配置文件中 store.config.server 的地址信息,例如: store.config.server :为 http://127.0.0.1:8088,则 registry 为:http://127.0.0.1:8088/repos/ohpm。如果store.config.server 没有配置,取默认值。
1.5. 发布共享包
本地开发的共享包不管是静态共享包还是动态共享包,都可以通过ohpm命令工具或者使用Web页面来发布,一般开发工作中为了方便和效率,我们都使用命令行发布。
(1)本地生成ssh秘钥:1. ssh-keygen -m PEM -t RSA -b 4096 -f <your_key_path>
(2)登录 ohpm-repo 私仓管理地址,单击主页右上角的个人中心,新增公钥,将公钥文件(<your_key_path>.pub)的内容粘贴到公钥输入框中。
设置私钥路径:ohpm config set key_path <your_key_path>
(2)登录 ohpm-repo 私仓管理地址,单击主页右上角的个人中心,复制发布码。
(3)将发布码配置到 .ohpmrc 文件中:ohpm config set publish_id <your_publish_id>
(3)发布静态共享库:ohpm publish demo.har
(4)发布动态共享:ohpm publish demo.tgz
(5)动态共享包 HSP 包不能直接发布在私仓内,需要先转化为 .tgz 包
(5)将编译模式切换成release模式会打包出.taz包
1.5.1. 模块配置
(在库模块中(与src文件夹同一级目录下),添加如下文件:
(新建README.md文件:在README.md文件中必须包含包的介绍和引用方式,还可以根据包的内容添加更详细介绍。
(新建CHANGELOG.md文件:填写HAR的版本更新记录。
(添加LICENSE文件:LICENSE许可文件。
(README.md文件最终会展示在私仓网页平台,依赖使用方可以根据README.md说明直接使用,所以最好描述清晰。
(oh_package.json5配置文件说明:
{ "parameterFile": "../dependencies.json5", "keywords": [ "asr" ], "name": "@xx/base-asr", "version": "1.0.0-rc.9", "repository": "http://gerrit.google.com/mobile_harmony/base_asr", "description": "asr sdk", "main": "Index.ets", "author": "qingkouwei", "license": "Apache-2.0", "dependencies": { }
}
模块名称,版本号,说明都要符合要求,否会会上传私仓失败。版本号只能依次递增,无法向Android一样一个SNAPSHOT无限覆盖。
1.6. 场景实践
在实际开发过程中,一个工程可能会有多个SDK,SDK开发完成需要接入到其他工程,有事在定位问题调试时可能要频繁的上传到私仓,其他工程依赖打包后调试,这样每次编译sdk,在执行命令上传特别繁琐,效率低下,特别是一个工程有多个SDK,并且SDK还有依赖的情况下。
最好的办法是可以通过脚本一键编译和上传到私仓,并且根据依赖关系依次上传,也可以单独打包上传某个module。
先创建一个version.json5存放SDK版本:
{ "project": { "sdk_version": "1.1.0-rc.1", }
}
自动打包:
def run_commands(modulename, productname): hvigor_home = '/Applications/DevEco-Studio.app/Contents/tools/hvigor' # 打包命令command1 = 'node %s/bin/hvigorw.js --mode module -p product=default -p module=%s@default -p buildMode=debug assembleHar --analyze --parallel --incremental --daemon' %(hvigor_home,modulename) # 等待第一个命令执行完成 process1.wait() # 上传命令 ohpm publish productnameprocess2.wait()
}
自动修改版本号:
def changeVersionAModule(): with open('version.json5', 'r') as f: data = json5.load(f) versionName = data['project']['sdk_version'] with open('AModule/oh-package.json5', 'r') as f: aData = json5.load(f) aData['version'] = versionName with open('AModule/oh-package.json5', 'w') as f: json.dump(aData, f, indent=4) with open('dependencies.json5', 'r') as depf: depData = json5.load(depf) depData['version_base']['base-a'] = versionName with open('dependencies.json5', 'w') as depf: json.dump(depData, depf, indent=4)
相关文章:
HarmonyOS 私仓搭建
1. HarmonyOS 私仓搭建 私仓搭建文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-ohpm-repo-quickstart-V5 发布共享包[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-har-publish-0000001597973129-V5]…...
Mybatis学习笔记(二)
八、多表联合查询 (一) 多表联合查询概述 在开发过程中单表查询不能满足项目需求分析功能,对于复杂业务来讲,关联的表有几张,甚至几十张并且表与表之间的关系相当复杂。为了能够实业复杂功能业务,就必须进行多表查询,…...
Google“Big Sleep“人工智能项目发现真实软件漏洞
据Google研究人员称,该公司的一个人工智能项目足够聪明,能够自行发现现实世界中的软件漏洞;Google的人工智能项目最近在开源数据库引擎 SQLite 中发现了一个之前未知的可利用漏洞。 该公司随后在正式软件发布之前报告了这一漏洞,这…...
npm入门教程5:package.json
一、package.json 文件的作用 依赖管理:列出项目所依赖的包(库)及其版本,便于其他开发者或自动化工具快速安装和更新这些依赖。元数据描述:提供项目的描述、作者、许可证等元信息,有助于项目的管理和维护。…...
docker-高级(待补图)
文章目录 数据卷(Volume)介绍查看方法删除方法绑定方法匿名绑定具名绑定Bind Mount 数据卷管理 网络bridge(桥接模式 默认)HOST(主机模式)Nonecontainer(指定一个容器进行关联网络共享)自定义(推荐)docker network 命令创建网络docker network create 实例展示-自定义实例展示-…...
Qt 文件目录操作
Qt 文件目录操作 QDir 类提供访问系统目录结构 QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统。 Qt 使用“/”作为通用目录分隔符,与“/”在 URL 中用作路径分隔符…...
Pandas 数据清洗
1.数据清洗定义 数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。 2.清洗空值 DataFrame.dropna(axis0, howany, threshN…...
IO学习笔记
当前需求,希望进行游戏可以保存游戏进度,可以将游戏的进度保存到一个文本文件,每一次打完游戏更新文本内容,下一次打游戏读取游戏进度,这里就涉及到两个知识IO流和File的知识。 File类 概述 java.io.File 类是文件…...
汇编练习-1
1、要求 练习要求引自《汇编语言-第4版》实验10.3(P209页) -编程,将data段中的数据,以10进制的形式显示出来 data segment dw 123,12666,1,8,3,38 data ends 2、实现代码(可惜没找到csdn对8086汇编显示方式) assume cs:codedata segmentdw 16 dup(0) ;除…...
初识二叉树( 二)
初识二叉树 二 实现链式结构二叉树前中后序遍历遍历规则代码实现 结点个数以及高度等层序遍历判断是否为完全二叉树 实现链式结构二叉树 ⽤链表来表示⼀棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针…...
AcWing1077-cnblog
问题背景 给定一个树形结构的图,每个节点代表一个地点,每个节点有一个守卫的代价。我们希望以最低的代价在树的节点上放置守卫,使得整棵树的所有节点都被监控。可以通过三种方式覆盖一个节点: 由父节点监控。由子节点监控。自己…...
五、SpringBoot3实战(1)
一、SpringBoot3介绍 1.1 SpringBoot3简介 SpringBoot版本:3.0.5 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.introducing-spring-boot 到目前为止,你已经学习了多种配置Spring程序的方式…...
练习LabVIEW第三十三题
学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第三十三题: 用labview编写一个判断素数的程序 开始编写: LabVIEW判断素数,首先要搞…...
如何在服务器端对PDF和图像进行OCR处理
介绍 今天我想和大家分享一个我在研究技术资料时发现的很好玩的东西——Tesseract。这不仅仅是一个普通的库,而是一个用C语言编写的OCR神器,能够识别一大堆不同国家的语言。我一直在寻找能够处理各种文档的工具,而Tesseract就像是给了我一把…...
Windows 下实验视频降噪算法 MeshFlow 详细教程
MeshFlow视频降噪算法 Meshflow 视频降噪算法来自于 2017 年电子科技大学一篇高质量论文。 该论文提出了一个新的运动模型MeshFlow,它是一个空间平滑的稀疏运动场 (spatially smooth sparse motion field),其运动矢量 (motion vectors) 仅在网格顶点 (m…...
Python入门:如何正确的控制Python异步并发量(制并发量的关键技巧与易错点解析)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 异步并发量控制 📒📝 Python异步并发简介📝 为什么要限制并发量🎈 资源管理🎈 服务稳定性📝 新手容易犯的错误🎈 忽略并发量限制🎈 错误设置并发量📝 设置并发量要注意的事情🎈 了解任务类型🎈 考虑系统资…...
qt QCheckBox详解
QCheckBox 是 Qt 框架中的一个控件,用于创建复选框,允许用户进行选择和取消选择。它通常用于表单、设置界面和任何需要用户选择的场景。 QCheckBox继承自QAbstractButton类,因此继承了按钮的特性。它表示一个复选框,用户可以通过…...
PAT甲级-1041 Be Unique
题目 题目大意 从一组数字中选出第一个唯一出现的数,输出该数。如果没有,则输出None。 思路 哈希的思想,将数值作为索引,对应该数值出现的次数,然后遍历数组即可。 注意第一个数字是指数字的个数,不是数…...
【jvm】如何设置堆内存大小
目录 1. 使用命令行参数设置2. idea中设置3. 注意事项 1. 使用命令行参数设置 1.在Java命令后添加-Xms和-Xmx参数。2.-Xms参数用于设置JVM的初始堆内存大小,等价于-XX:InitialHeapSize。3.-Xmx参数用于设置JVM的最大堆内存大小,等价于-XX:MaxHeapSize。…...
kernel源码分析 do_msgsnd read_msg
笔者分析的源码是v 5.11.22 链接:msg.c - ipc/msg.c - Linux source code v5.11.22 - Bootlin do_msgsnd static long do_msgsnd(int msqid, long mtype, void __user *mtext,size_t msgsz, int msgflg) {struct msg_queue *msq;struct msg_msg *msg;int err;str…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
