java接口 传外参_JCommander:Java外部参数解析利器
13/Mar 2015
最近需要把项目交给别人进行运维,为了不让接手之人涉及太多繁琐细节,我把一些定义在final类中的不可变量抽取出来,把项目变成可外部配置的。用配置文件可以达到这个目的,但由于配置之间有相互依赖关系,比如:
public static boolean local = false;
public static String host = (local) ? "127.0.0.1" : "172.16.3.142";
public static int port = (local) ? 6379 : 6380;
原本只需要改变local, 用配置文件的话与local值有依赖关系的地方都要面临修改。
后来打算用命令行参数实现可外部动态配置,如果自己动手实现完善的命令行参数解析,可不是一项little job。 比较了几款开源的工具,还是选择了JCommander。主要原因是被它官网的slogan打动了:
Because life is too short to parse command line parameters.
项目是maven构建的,使用JCommander的方式十分简单:
com.beust
jcommander
使用JCommander的方式也很简单,给需要外部传参的变量加Parameter标注:
@Parameter(names = { "-topologyName"}, description = "Topology name.")
private static String TOP_NAME = "sz-train";
一般类型参数后面都要跟值,JCommander会根据对应变量做类型检查和转换,不合法时会抛出异常错误。
boolean类型有点特殊,后面不需要跟一个值,输入-local之后,local值即为true:
@Parameter(names = { "-local"}, description = "Local model, default cluster Model.")
public static boolean LOCAL_MODE = false;
如果一个boolean变量的默认值为true,而想通过参数设置为false,可以指定元数:
@Parameter(names = { "-log", "-verbose"}, description = " Wheather to write system log.", arity = 1)
public static boolean LOG = true;
默认情况下,参数是可选的,如果要求必须指定参数,可以设置required:
@Parameter(names = "-operator", required = true)
private String operator;
有时仅仅依靠JCommander的类型检查还不够,还需要自定义检查器提前发现不合法的输入:
@Parameter(names = { "-redisPort"}, description = "Redis port.", validateWith = PortValidator.class)
public static int REDIS_PORT=(LOCAL_MODE) ? 6379:6380;
public static class PortValidator implements IParameterValidator {
public void validate(String name, String value)
throws ParameterException {
Pattern pattern = Pattern.compile("[1-9]\\d*");
Matcher matcher = pattern.matcher(value);
if (matcher.matches()) {
int n = Integer.parseInt(value);
if (n < 65536) {
return;
}
}
throw new ParameterException("Parameter " + name
+ " should be a number(0~65535) (found " + value +")");
}
}
如果是一个写日志的目录,可以提前发现该目录是否可写,这是配置文件无法做到的:
@Parameter(names = { "-logDir"}, description = "Dir to write log file.",
validateWith = DirValidator.class)
public static String LOG_DIR = "/logs/your_project/";
public static class DirValidator implements IParameterValidator {
public void validate(String name, String value)
throws ParameterException {
File file = new File(value);
if (!file.isDirectory() || !file.canWrite()) {
throw new ParameterException("Parameter " + name
+ " should be a writable folder(found " + value +")");
}
}
}
对于IP地址,不仅可以通过正则表达式进行匹配,还可以进行简单的网络连通性探测等。相比基于文本的配置文件,JCommander显示出了强大的优势。
但更多的项目可能还是更适合用配置文件的方式进行外部配置,如果配置文件如果可以吸收JCommander的特点,那就perfect了。我理想中的配置文件应该有如下特性:
- 配置文件本身是programmable
- 可以进行上下文联系
- 自动类型检查和转换
- 可以自定义语义检查器
- 所使用的弱语言可以方便嵌入
Tags//
java,
More Reading
java接口 传外参_JCommander:Java外部参数解析利器相关推荐
- Java 接口基础详解,java开发面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- java 接口中变量修饰符,Java的访问修饰符与变量的作用域讲解
Java访问修饰符(访问控制符) Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: ? Java 的修饰符很多,分为访问修饰符和非访问修饰符.本节仅介绍访问修 ...
- java接口深入理解,深入理解Java接口
从java接口是什么到为什么,理解java接口,主要解决三个问题 1.java接口是什么 2.java接口为什么 3.java接口怎么用 java接口是什么 接口是方法的抽象,通过接口规定类需要实现那 ...
- java上传文件到服务器,java上传文件到云服务器
java上传文件到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装 ...
- java 接口中 常量_在Java接口中怎样访问定义的常量呢?
java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).那么我们在Java接口中怎 ...
- java接口自动化demo_第一个java 接口自动化程序
第一个Java实现的接口测试 御都 字数 1065 · 阅读 0 2019-04-09 08:14 一.背景 使用HttpClient框架提交一个post&get申请,并对打印出返回值和状态码 ...
- java矩阵传递给r_从JAVA调用R得到卡方统计和p值
我在JAVA中有两个4 * 4矩阵,其中一个矩阵包含观察计数和其他预期计数. 我需要一种自动的方法来计算这两个矩阵之间的卡方统计量的p值; 但是,就我所知,JAVA没有这样的功能. 我可以通过将两个矩 ...
- excel字段自动java类,Java 接口自动化系列--工具类之Excel测试数据解析封装
在进行数据解析时,先来看看excel测试数据格式,这里采用接口和测试数据分离的方式,即分为两个sheet页签分别存放接口信息,用例信息 excel封装成对象步骤 1.导入easypoi的坐标 2.加载 ...
- java接口有非抽象方法_[Java教程]纳尼,java可以在接口中实现非抽象方法了?
[Java教程]纳尼,java可以在接口中实现非抽象方法了? 0 2016-09-17 18:00:20 纳尼,接口中可以定义实例方法了?! 纳尼,接口中还可以定义静态方法了?! 没错,在Java8中 ...
最新文章
- 效果很好的asp.net的数据库访问模型(优化,封装一体化)
- 在VMware15中创建虚拟机安装ubuntu系统(超详细教程)
- 利用samba实现网络文件共享
- babel原理_带你了解 snowpack 原理,你还学得动么(下)
- Linux Crontab 定时任务 及 Ubuntu 中cron指令使用
- PTA 程序设计天梯赛(121~140题)
- 一步步在GitHub上创建博客主页(7)--兼容Windows Writer的服务提供器
- 微软的“后门”:NTSD.exe,NTSD 的远程调试功能
- 2.自编码器(去噪自编码器,DAE)
- adb命令logcat抓取日志
- Web漏洞扫描工具AWVS12使用详解
- scjp第一章学习总结
- 如何以16进制打开dll文件
- 企业级POS收银系统源码(客户端+后台)
- Linux 课程设计 每日小
- unity 纹理压缩格式‘_游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式?...
- 5分钟通过水痘事件来认识系统架构
- 谷歌身份验证器验证码不对怎么回事_兼容谷歌验证器,开源的动态验证码小程序了解一下...
- PayPal支付集成到自己Web网站
- android build.versioncodes.kitkat,Android 4.1至4.4 KitKat-为API启用TLS 1.2