Java 如何使用Apache Commons CLI解析属性文件和--help选项?

Java 如何使用Apache Commons CLI解析属性文件和--help选项?,java,properties,command-line-arguments,apache-commons-cli,Java,Properties,Command Line Arguments,Apache Commons Cli,我有一个这样的属性文件- hostName=machineA.domain.host.com emailFrom=tester@host.com emailTo=world@host.com emailCc=hello@host.com java -jar abc.jar config.properties java -jar abc.jar config.properties hostName=machineB.domain.host.com 现在我从Java程序中读取上面的属性文件,如下

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

hostName=machineA.domain.host.com
emailFrom=tester@host.com
emailTo=world@host.com
emailCc=hello@host.com
java -jar abc.jar config.properties
java -jar abc.jar config.properties hostName=machineB.domain.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运行,如下所示-

hostName=machineA.domain.host.com
emailFrom=tester@host.com
emailTo=world@host.com
emailCc=hello@host.com
java -jar abc.jar config.properties
java -jar abc.jar config.properties hostName=machineB.domain.host.com
我的问题是-

  • 在运行
    abc.jar
    时,是否有任何方法可以添加
    --help
    选项,告诉我们如何运行jar文件,以及每个属性的含义和使用方法?我在运行C++的可执行文件或UNIX的时候,看到了帮助> /COD>,所以不确定我们如何在Java中做同样的事情?李>

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

从长远来看,如果您计划在将来添加其他选项,那么commons cli肯定是一个相当合适的选择,因为它使添加新选项变得很容易,手动解析很快就会变得复杂

请看一下,它们很好地概述了库的功能

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

    // 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());
//创建选项对象
选项=新选项();
选项帮助=新选项(“h”,“帮助”,false,“打印此消息”);
选项。添加选项(帮助);
CommandLineParser parser=新的PosixParser();
CommandLine cmd=parser.parse(选项、参数);
if(cmd.haspoption(“help”)| | cmd.getArgList().isEmpty()){
//自动生成帮助语句
HelpFormatter formatter=新的HelpFormatter();
printHelp(“cli测试[选项]”,选项);
返回;
}
//做你的事。。。
System.out.println(“Had properties”+cmd.getArgList());

谢谢你的建议。我正在浏览您建议的链接,但我无法理解如何使这些链接适应我的用例。如果可能,并且为了我的理解,您能否提供一个示例,说明我们将如何在此处使用commons cli?这将帮助我更好地理解。我在这里包含的代码示例中缺少什么?我的意思是-如何使用Commons CLI解析属性中的变量,而不是手动解析?还有一些方法告诉人们这些变量名是什么?如果我真的帮了忙,那么它应该告诉我们每个变量意味着什么?我想在某种程度上回答了这个问题。这上面的文件在