获取 Java 运行时参数 --argumentName=argumentValue
Getting Java Runtime Arguments --argumentName=argumentValue
我需要 运行 一个程序,其中 运行time 参数以以下形式传递,
--argumentName=argumentVaue
我需要在如下所示的主函数中获取这些值,
public class TestArguments {
public static void main(String[] args) {
System.out.println(System.getProperty("argumentA"));
System.out.println(System.getProperty("argumentB"));
System.out.println(System.getProperty("argumentC"));
System.out.println(System.getProperty("argumentD"));
for(int i=0; i<args.length; i++) {
System.out.println("Argument " + i + " equals " + args[i]);
}
}
}
当我遍历 args
中的值时,我只得到一个大字符串,例如 --argumentA=foo
。我可以做一个 string.split("=") 来将名称与值分开,但这似乎不是一种通过名称获取参数值的优雅方式。我认为 System.getProperty("argumentName")
可以解决问题,但值始终是 null
。我正在 运行 通过像这样 java -cp "myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d
.
的罐子安装我的程序
实际上,您在 class 开始之后传递程序参数时传递它们:
"java -cp myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d.
System.getProperty(String)
方法允许检索系统 属性,这是另一回事。这就是您不使用此方法检索程序参数的原因。
System
属性是系统的属性(OS)。
您可以 pass/create 通过将它们作为 JVM 参数(而不是程序参数)传递并在您的程序中更轻松地检索它们来增加它们:
java -DargumentA=a -DargumentB=b -DargumentC=c -DargumentD=d -cp
"myProgram.jar" com.foo.bar.TestArguments
但是绕过系统属性以简化程序特定参数的检索是相当具有误导性的。
所以保留你的程序参数,而不是拆分 String
参数,使用 API 来做到这一点。
Arg4J 很好实现。
就这么简单:
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import org.kohsuke.args4j.OptionHandlerFilter;
public class TestArguments {
@Option(name = "--argumentA", usage = "...")
private String argumentA;
@Option(name = "--argumentB", usage = "...")
private String argumentB;
@Option(name = "--argumentC", usage = "...")
private String argumentC;
@Option(name = "--argumentD", usage = "...")
private String argumentD;
public static void main(String[] args) throws IOException {
new TestArguments().doMain(args);
// run the logic of the program
}
public void doMain(String[] args) throws IOException {
CmdLineParser parser = new CmdLineParser(this);
try {
// parse the arguments.
parser.parseArgument(args);
} catch (CmdLineException e) {
System.err.println(e.getMessage());
parser.printUsage(System.err);
return;
}
}
}
您也可以使用 Apache Commons CLI,这是一个非常好的命令行解析库。
您可以在 Maven 或 Gradle 项目中使用它。
在 Gradle 项目中,您需要将其插入到依赖项中:
compile group: 'commons-cli', name: 'commons-cli', version: '1.4'
下面是如何在 Apache Commons CLI 中实现此参数 (--argumentName=argumentValue
) 的示例:
import org.apache.commons.cli.*;
public class CLITestMain {
public static void main(String[] args) throws ParseException {
// create Options object
Options options = new Options();
// add a option
options.addOption("a", "argumentName", true, "Do something");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
if(cmd.hasOption("a")) {
System.out.println("You nailed it!");
System.out.println(cmd.getOptionValue("a"));
}
else {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "CLITestMain", options );
}
}
}
此示例支持参数的短格式和开箱即用的长格式。
长格式:
java CLITestMain --argumentName=hi
缩写形式:
java CLITestMain -a=hi
我需要 运行 一个程序,其中 运行time 参数以以下形式传递,
--argumentName=argumentVaue
我需要在如下所示的主函数中获取这些值,
public class TestArguments {
public static void main(String[] args) {
System.out.println(System.getProperty("argumentA"));
System.out.println(System.getProperty("argumentB"));
System.out.println(System.getProperty("argumentC"));
System.out.println(System.getProperty("argumentD"));
for(int i=0; i<args.length; i++) {
System.out.println("Argument " + i + " equals " + args[i]);
}
}
}
当我遍历 args
中的值时,我只得到一个大字符串,例如 --argumentA=foo
。我可以做一个 string.split("=") 来将名称与值分开,但这似乎不是一种通过名称获取参数值的优雅方式。我认为 System.getProperty("argumentName")
可以解决问题,但值始终是 null
。我正在 运行 通过像这样 java -cp "myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d
.
实际上,您在 class 开始之后传递程序参数时传递它们:
"java -cp myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d.
System.getProperty(String)
方法允许检索系统 属性,这是另一回事。这就是您不使用此方法检索程序参数的原因。
System
属性是系统的属性(OS)。
您可以 pass/create 通过将它们作为 JVM 参数(而不是程序参数)传递并在您的程序中更轻松地检索它们来增加它们:
java -DargumentA=a -DargumentB=b -DargumentC=c -DargumentD=d -cp
"myProgram.jar" com.foo.bar.TestArguments
但是绕过系统属性以简化程序特定参数的检索是相当具有误导性的。
所以保留你的程序参数,而不是拆分 String
参数,使用 API 来做到这一点。
Arg4J 很好实现。
就这么简单:
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import org.kohsuke.args4j.OptionHandlerFilter;
public class TestArguments {
@Option(name = "--argumentA", usage = "...")
private String argumentA;
@Option(name = "--argumentB", usage = "...")
private String argumentB;
@Option(name = "--argumentC", usage = "...")
private String argumentC;
@Option(name = "--argumentD", usage = "...")
private String argumentD;
public static void main(String[] args) throws IOException {
new TestArguments().doMain(args);
// run the logic of the program
}
public void doMain(String[] args) throws IOException {
CmdLineParser parser = new CmdLineParser(this);
try {
// parse the arguments.
parser.parseArgument(args);
} catch (CmdLineException e) {
System.err.println(e.getMessage());
parser.printUsage(System.err);
return;
}
}
}
您也可以使用 Apache Commons CLI,这是一个非常好的命令行解析库。
您可以在 Maven 或 Gradle 项目中使用它。
在 Gradle 项目中,您需要将其插入到依赖项中:
compile group: 'commons-cli', name: 'commons-cli', version: '1.4'
下面是如何在 Apache Commons CLI 中实现此参数 (--argumentName=argumentValue
) 的示例:
import org.apache.commons.cli.*;
public class CLITestMain {
public static void main(String[] args) throws ParseException {
// create Options object
Options options = new Options();
// add a option
options.addOption("a", "argumentName", true, "Do something");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
if(cmd.hasOption("a")) {
System.out.println("You nailed it!");
System.out.println(cmd.getOptionValue("a"));
}
else {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "CLITestMain", options );
}
}
}
此示例支持参数的短格式和开箱即用的长格式。
长格式:
java CLITestMain --argumentName=hi
缩写形式:
java CLITestMain -a=hi