代码之家  ›  专栏  ›  技术社区  ›  Kyle Bridenstine

获取Java运行时参数--argumentName=argumentValue

  •  1
  • Kyle Bridenstine  · 技术社区  · 6 年前

    我需要运行一个程序,其中运行时参数以表单形式传递,

    --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 .我可以做一个字符串。拆分(“=”)以将名称与值分开,但这似乎不是一种通过名称获取参数值的优雅方式。我想 System.getProperty("argumentName") 会有效果,但价值总是 null .我正在通过这样一个罐子运行我的程序 java -cp "myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d

    2 回复  |  直到 6 年前
        1
  •  2
  •   davidxxx    6 年前

    实际上,在类启动后传递程序参数时传递程序参数:

    "java -cp myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d.
    

    这个 System.getProperty(String) 方法允许检索系统属性,这是另一回事。这就是为什么不使用此方法检索程序参数。

    System 属性是系统(OS)的属性。
    您可以通过将它们作为JVM参数(而不是程序参数)传递,来传递/创建其他这些参数,并在程序中更容易地检索它们:

    java -DargumentA=a -DargumentB=b -DargumentC=c -DargumentD=d -cp 
        "myProgram.jar" com.foo.bar.TestArguments 
    

    但是,通过绕过系统属性来简化对特定于程序的参数的检索,这是相当误导的。

    因此,保留程序参数,而不是拆分 String args,请使用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;
           }     
        }
    }
    
        2
  •  1
  •   gil.fernandes    6 年前

    您也可以使用 Apache Commons CLI 这是一个非常好的用于分析命令行的库。

    您可以在Maven或Gradle项目中使用它。

    在Gradle项目中,您需要将其插入到依赖项中:

    compile group: 'commons-cli', name: 'commons-cli', version: '1.4'
    

    下面是如何实现此参数的示例( --argumentName=argumentValue )在Apache Commons CLI中:

    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