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外部参数解析利器相关推荐

  1. Java 接口基础详解,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  2. java 接口中变量修饰符,Java的访问修饰符与变量的作用域讲解

    Java访问修饰符(访问控制符) Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: ? Java 的修饰符很多,分为访问修饰符和非访问修饰符.本节仅介绍访问修 ...

  3. java接口深入理解,深入理解Java接口

    从java接口是什么到为什么,理解java接口,主要解决三个问题 1.java接口是什么 2.java接口为什么 3.java接口怎么用 java接口是什么 接口是方法的抽象,通过接口规定类需要实现那 ...

  4. java上传文件到服务器,java上传文件到云服务器

    java上传文件到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装 ...

  5. java 接口中 常量_在Java接口中怎样访问定义的常量呢?

    java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).那么我们在Java接口中怎 ...

  6. java接口自动化demo_第一个java 接口自动化程序

    第一个Java实现的接口测试 御都 字数 1065 · 阅读 0 2019-04-09 08:14 一.背景 使用HttpClient框架提交一个post&get申请,并对打印出返回值和状态码 ...

  7. java矩阵传递给r_从JAVA调用R得到卡方统计和p值

    我在JAVA中有两个4 * 4矩阵,其中一个矩阵包含观察计数和其他预期计数. 我需要一种自动的方法来计算这两个矩阵之间的卡方统计量的p值; 但是,就我所知,JAVA没有这样的功能. 我可以通过将两个矩 ...

  8. excel字段自动java类,Java 接口自动化系列--工具类之Excel测试数据解析封装

    在进行数据解析时,先来看看excel测试数据格式,这里采用接口和测试数据分离的方式,即分为两个sheet页签分别存放接口信息,用例信息 excel封装成对象步骤 1.导入easypoi的坐标 2.加载 ...

  9. java接口有非抽象方法_[Java教程]纳尼,java可以在接口中实现非抽象方法了?

    [Java教程]纳尼,java可以在接口中实现非抽象方法了? 0 2016-09-17 18:00:20 纳尼,接口中可以定义实例方法了?! 纳尼,接口中还可以定义静态方法了?! 没错,在Java8中 ...

最新文章

  1. 效果很好的asp.net的数据库访问模型(优化,封装一体化)
  2. 在VMware15中创建虚拟机安装ubuntu系统(超详细教程)
  3. 利用samba实现网络文件共享
  4. babel原理_带你了解 snowpack 原理,你还学得动么(下)
  5. Linux Crontab 定时任务 及 Ubuntu 中cron指令使用
  6. PTA 程序设计天梯赛(121~140题)
  7. 一步步在GitHub上创建博客主页(7)--兼容Windows Writer的服务提供器
  8. 微软的“后门”:NTSD.exe,NTSD 的远程调试功能
  9. 2.自编码器(去噪自编码器,DAE)
  10. adb命令logcat抓取日志
  11. Web漏洞扫描工具AWVS12使用详解
  12. scjp第一章学习总结
  13. 如何以16进制打开dll文件
  14. 企业级POS收银系统源码(客户端+后台)
  15. Linux 课程设计 每日小
  16. unity 纹理压缩格式‘_游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式?...
  17. 5分钟通过水痘事件来认识系统架构
  18. 谷歌身份验证器验证码不对怎么回事_兼容谷歌验证器,开源的动态验证码小程序了解一下...
  19. PayPal支付集成到自己Web网站
  20. android build.versioncodes.kitkat,Android 4.1至4.4 KitKat-为API启用TLS 1.2

热门文章

  1. tomcat压缩配置
  2. Android 飞机大战
  3. 74HC595使用说明与驱动原理
  4. 数学:SVM(2)点到直线距离
  5. PMSM矢量控制技术中的参数整定问题
  6. you-get 使用总结
  7. 百万CAD设计施工图全集素材大全免费获取!
  8. kontron工控机维修控创工业电脑维修SVIMX2
  9. Android歌词制作,Android动感歌词制作器(支持翻译和音译歌词)
  10. 基于ssm的超市商品信息管理系统的设计与实现