项目地址
cli: 命令行工具https://gitee.com/lyw2010/cli
#### 介绍
命令行工具
把命令行转化为vo
把vo转化为命令行
## 把命令行转化为VO
使用的场景是需要用过命令行发送到应用的时候,需要自己去解析发送过来的参数,这样耗时而且容易出错,特别是在参数很多的时候,是一个棘手的问题
比如发送的命令
java -jar xxxx.jar --sourceDataType "mysql" --sql " select *from ttt where id=2222" --sourceIp "127.0.0.1" --sourcePort "3306" --sourceSchema zgdc_warehouse_source --sourcePasswd 123456 --sourceUserName root --targetDataType mysql --targetIp 127.0.0.1 --targetPort "3306" --targetPasswd 123456 --targetSchema zgdc_warehouse_app --targetUserName root --targetTable xy_money_rate --holdTimeout null --where null --columns company_name,rate --columnsName 公司名称,占比 --dataType String,Double
public class IndicatorCalculateVO {
@Cli(
longOpt = "sourceDataType",
name = "数据库类型",
required = true,
desc = "数据库类型"
)
private String sourceDataType;
@Cli(
longOpt = "sql",
name = "需要执行的sql",
required = true,
desc = "需要执行的sql"
)
private String sql;
@Cli(
longOpt = "sourceIp",
name = "数据源的url",
required = true,
desc = "数据源的url"
)
private String sourceIp;
@Cli(
longOpt = "sourcePort",
name = "数据源的端口",
required = true,
desc = "数据源的端口"
)
private Integer sourcePort;
@Cli(
longOpt = "sourceSchema",
name = "数据库",
required = true,
desc = "数据库"
)
private String sourceSchema;
@Cli(
longOpt = "sourcePasswd",
name = "数据源的密码",
required = true,
desc = "数据源的密码"
)
private String sourcePasswd;
@Cli(
longOpt = "sourceUserName",
name = "数据源的用户信息",
required = true,
desc = "数据源的用户信息"
)
private String sourceUserName;
@Cli(
longOpt = "targetDataType",
name = "目标数据库的类型",
required = true,
desc = "目标数据库的类型"
)
private String targetDataType;
@Cli(
longOpt = "targetIp",
name = "目标数据源的url",
required = true,
desc = "目标数据源的url"
)
private String targetIp;
@Cli(
longOpt = "targetPort",
name = "数据源的端口",
required = true,
desc = "数据源的端口"
)
private Integer targetPort;
@Cli(
longOpt = "targetPasswd",
name = "目标数据源的密码",
required = true,
desc = "目标数据源的密码"
)
private String targetPasswd;
@Cli(
longOpt = "targetSchema",
name = "数据库",
required = true,
desc = "数据库"
)
private String targetSchema;
@Cli(
longOpt = "targetUserName",
name = "目标数据源的用户信息",
required = true,
desc = "目标数据源的用户信息"
)
private String targetUserName;
@Cli(
longOpt = "targetTable",
name = "目标数据表",
required = true,
desc = "目标数据表"
)
private String targetTable;
@Cli(
longOpt = "holdTimeout",
name = "holdTimeout",
desc = "数据保留是时长 单位是小时"
)
private Integer holdTimeout;
@Cli(
longOpt = "where",
name = "where",
desc = "where 查询条件"
)
private String where;
@Cli(
longOpt = "columns",
name = "表的列",
desc = "表的列"
)
private String columns;
@Cli(
longOpt = "columnsName",
name = "表的列名字 多个使用逗号分隔 和columns长度一致",
desc = "表的列名字 多个使用逗号分隔 和columns长度一致"
)
private String columnsName;
@Cli(
longOpt = "dataType",
name = "数据类型 多个使用逗号分隔 和columns长度一致",
desc = "数据类型 多个使用逗号分隔 和columns长度一致"
)
private String dataType;
}
``````
这样转化的时候,需要挨个的去选择,去识别,顺序需要严格的控制。
有了这个工具之后,只需要在接收参数地方进行一次转化就可以了
``````
object IndicatorCalculateApp {
private[this] val logger: Logger = LoggerFactory.getLogger(classOf[IndicatorCalculateApp])
def main(args: Array[String]): Unit = {
logger.info(s"请求参数是:")
val vo = CliUtils.parseObject(args, classOf[IndicatorCalculateVO])
println(vo)
}
}
``````
这样的参数在转化VO
这样分分钟就可以实现
## 把VO转化为 命令行
在使用的时候,需要通过 命令行的方式,把使用的参数传给应用,操作比较麻烦
比如需要把上面的IndicatorCalculateVO 通过命令行发给应用,么有专门的工具,需要自己挨个的使用
使用工具之后
CliUtils.getCommandLine(vo, IndicatorCalculateVO.class);
具体的实现
/**
* 获取命令行
*
* @param entry 实体
* @param <T> 需要转化的vo
* @return 命令行
*/
private static <T> String getCommandLineWithException(T entry) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
Class<T> clazz = (Class<T>) entry.getClass();
return getCommandLine(entry, clazz);
}
这样,参数和vo的相互转化使用统一的工具进行转化,减少出错,只是关系功能就可以了,不需要挨个的去对每一个参数的情况,减少工作量