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
选项,告诉我们如何运行jar文件,以及每个属性的含义和使用方法?我在运行C++的可执行文件或UNIX的时候,看到了--help
帮助> /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解析属性中的变量,而不是手动解析?还有一些方法告诉人们这些变量名是什么?如果我真的帮了忙,那么它应该告诉我们每个变量意味着什么?我想在某种程度上回答了这个问题。这上面的文件在