【问题标题】:How to use Apache Commons CLI to parse the property file and --help option?如何使用 Apache Commons CLI 解析属性文件和 --help 选项?
【发布时间】:2014-12-23 15:16:00
【问题描述】:

我有一个像这样的属性文件 -

hostName=machineA.domain.host.com
emailFrom=tester@host.com
emailTo=world@host.com
emailCc=hello@host.com

现在我正在从我的 Java 程序中读取上述属性文件,如下所示。到目前为止,我正在以手动方式解析上述属性文件-

public class FileReaderTask {
    private static String hostName;
    private static String emailFrom;
    private static String emailTo;
    private static String emailCc;

    private static final String configFileName = "config.properties";
    private static final Properties prop = new Properties();

    public static void main(String[] args) {
        readConfig(arguments);

        // use the above variables here
        System.out.println(hostName);
        System.out.println(emailFrom);
        System.out.println(emailTo);
        System.out.println(emailCc);
    }

    private static void readConfig(String[] args) throws FileNotFoundException, IOException {
        if (!TestUtils.isEmpty(args) && args.length != 0) {
            prop.load(new FileInputStream(args[0]));
        } else {
            prop.load(FileReaderTask.class.getClassLoader().getResourceAsStream(configFileName));
        }

        StringBuilder sb = new StringBuilder();
        for (String arg : args) {
            sb.append(arg).append("\n");
        }
        String commandlineProperties = sb.toString();

        if (!commandlineProperties.isEmpty()) {
            // read, and overwrite, properties from the commandline...
            prop.load(new StringReader(commandlineProperties));
        }           

        hostName = prop.getProperty("hostName").trim();
        emailFrom = prop.getProperty("emailFrom").trim();
        emailTo = prop.getProperty("emailTo").trim();
        emailCc = prop.getProperty("emailCc").trim();
    }
}

大多数时候,我会通过命令行将上面的程序作为可运行的 jar 运行,就像这样 -

java -jar abc.jar config.properties
java -jar abc.jar config.properties hostName=machineB.domain.host.com

我的问题是-

  • 有没有办法在运行abc.jar 时添加--help 选项,可以告诉我们更多关于如何运行jar 文件以及每个属性的含义以及如何使用它们的信息?我在运行大多数 C++ 可执行文件或 Unix 东西时看到了--help,所以不确定我们如何在 Java 中做同样的事情?

我是否需要在 Java 中使用像 Commons CLI 这样的命令行解析器来实现这一点,而不是手动解析,我应该使用 Commons CLI 来解析文件吗?如果是,那么任何人都可以提供一个示例,我将如何在我的场景中做到这一点?

【问题讨论】:

    标签: java properties command-line-arguments apache-commons-cli


    【解决方案1】:

    从长远来看,如果您计划在未来添加其他选项,那么 commons-cli 肯定是一个相当不错的选择,因为它可以轻松添加新选项,并且手动解析很快就会变得复杂。

    看看official examples,他们很好地概述了图书馆可以做什么。

    您的具体情况可能会导致以下情况:

        // create Options object
        Options options = new Options();
    
        Option help = new Option( "h", "help", false, "print this message" );
        options.addOption(help);
    
        CommandLineParser parser = new PosixParser();
        CommandLine cmd = parser.parse( options, args);
    
        if(cmd.hasOption("help") || cmd.getArgList().isEmpty()) {
            // automatically generate the help statement
            HelpFormatter formatter = new HelpFormatter();
            formatter.printHelp( "cli-test [options] <property-file>", options );
    
            return;
        }
    
        // do your thing...
        System.out.println("Had properties " + cmd.getArgList());
    

    【讨论】:

    • 感谢您的建议。我正在浏览您建议的链接,但我无法理解如何使它们适应我的用例。如果可能并且根据我的理解,您能否提供一个示例,我们将如何在此处使用 commons-cli?这将有助于我更好地理解。
    • 我在此处包含的代码示例中缺少什么?
    • 我的意思是 - 如何使用 Commons CLI 从属性中解析变量而不是手动方式?还有一些方法可以告诉人们这些变量名是什么?就像如果我提供帮助,那么它应该告诉我们每个变量的含义是什么?
    • 我认为stackoverflow.com/questions/18611791/… 在某种程度上回答了这个问题。相关文档位于commons.apache.org/proper/commons-cli/…
    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2016-12-18
    • 2023-03-22
    相关资源
    最近更新 更多