Java服务_JOptSimple命令行参数处理器
1.使用背景
在服务器上运行任务类型的java程序,通常是使用java jar xxx.jar、hadoop jar xxx.jar、spark-submit xxx.jar等linux命令。为了将参数与程序进行解耦,加强代码的通用性,通常会将很多参数值与运行命令一起传入程序。
如hbase快照解析工具的运行命令:
1 | hadoop jar HBaseSnapshotRead-1.0-SNAPSHOT.jar -hdfsUrl hdfs://ns22017 -splitAlgorithm UniformSplit -snapshotName snapshot_hb_ibd_HB_IBD_PRODUCT_COMPETE_SOURCE_NEW -numSplitsPerRegion 70 -hbaseRootDir hdfs://ns22017/user/ads_sz_load/hfile_convert/origin -outputPath /user/ads_sz_load/hbasetohive/result/ -tmpPath /user/ads_sz_load/hbasetohive/tmp/snapshot -firstRowKeyType long -compressionAlgorithm Gzip |
如spark删数工具的运行命令:
1 | spark-submit --class com.jd.ads.HbaseMain --master yarn --deploy-mode client --conf spark.speculation=false --executor-cores 5 --executor-memory 30g --driver-memory 10g --num-executors 10 --total-executor-cores 500 HbaseDelete-v1.2.6.jar hbase=HB_IBD_INDUSTRY_BRAND_GOODS_NEW_INDEX dt=2022-07-15 dataCycle=d30 sourceFileDir=hiveLocation isRunSql=true hbaseCluster=hbaseCluster_offline isFilterCycle=true batchDeleteSize=10 |
这些运行命令中的xxx.jar之后的参数都会作为main方法的String[] args入参。
JOptSimple是一个比较简单常用的命令行解析器,可以以比较优雅的方式进行参数解析。
2.使用方法
2.1在pom.xml文件中引入依赖
1 | <dependency> |
2.2创建命令行参数处理类
提前设计好需要传入哪些参数,在命令行参数处理类中创建对应的属性。
1 | import joptsimple.OptionParser; |
重要:这种配置类一般都是使用饿汉单例模式来创建。
2.3在main方法类中使用
- 创建一个命令行参数处理器静态属性实例。
- 创建一个config静态方法,用于执行命令行参数解析等一切前期配置工作。
- 在main方法的最前面调用config方法。
- 在main方法的后续可以直接通过get方法获取目标参数。
1 | public class GetHbaseTool extends Configured implements Tool { |
重要:一般配置类实例和方法都设置为静态,这样无论启动多少个mian方法类实例,都是使用同一个累之类实例和方法,可以有效减少内存浪费。
2.4在拼接命令行参数时加入相应参数
1 | hadoop jar HBaseSnapshotRead-1.0-SNAPSHOT.jar -hdfsUrl hdfs://ns22017 -splitAlgorithm UniformSplit -snapshotName snapshot_hb_ibd_HB_IBD_PRODUCT_COMPETE_SOURCE_NEW -numSplitsPerRegion 70 -hbaseRootDir hdfs://ns22017/user/ads_sz_load/hfile_convert/origin -outputPath /user/ads_sz_load/hbasetohive/result/ -tmpPath /user/ads_sz_load/hbasetohive/tmp/snapshot -firstRowKeyType long -compressionAlgorithm Gzip |
重要:使用JOptSimple时必须要以-参数名 参数值的形式拼接命令行。
重要:如果想要实现某些参数非必传、有默认值、未传抛出异常等功能,都可以在OptionsProcessor命令行参数处理类中进行实现。
3.总结
不使用JOptSimple命令行解析器,当然也可以直接对输入的命令行参数进行解析,比如没有参数名、参数名=参数值的形式。JOptSimple命令行解析器只不过是为我们提供的一种现成的解析方法,我认为最大的两个优点:
-参数名 参数值格式非常优雅,写java代码之中牢记最重要的一点:优雅。- 将参数解析中很多与main方法主程序逻辑分隔开,一方面可以拓展很多其他参数处理功能,另一方面非常的优雅。