Java 如何在执行jar时给出参数值?

Java 如何在执行jar时给出参数值?,java,jar,executable-jar,Java,Jar,Executable Jar,我的主类中有两个输入参数,例如: public static void main(String[] args) throws IOException, JSONException, ParseException { DataFromES df = new DataFromES(); String year = ""; String[] month = {""}; for (String m : month) { df.receiveData

我的主类中有两个输入参数,例如:

  public static void main(String[] args) throws IOException, JSONException, ParseException {

    DataFromES df = new DataFromES();
    String year = "";
    String[] month = {""};

    for (String m : month) {
        df.receiveData(year,m);

    }

    System.out.println("Excel Generated");
}
我已经为我的项目生成了
jar
。但是我不确定在通过
CMD
执行时如何将值传递给
jar
。我已经知道如何将参数传递给jar,但不清楚如何将值传递给上述两个
字符串

在main()方法中,您需要声明两个变量:

public static void main(String[] args) {
    String year = args[0];
    String month = args[1];

    .... your treatment ...
}
因此,将年作为第一个参数,将月作为第二个参数;)

在main()方法中,需要声明两个变量:

public static void main(String[] args) {
    String year = args[0];
    String month = args[1];

    .... your treatment ...
}

因此,将年作为第一个参数,将月作为第二个参数;)

您可以使用
java
命令将参数传递给args,如下所示:

java -cp jar-name.jar complete-class-name "2016" "08"
String year = args[0];
String month = args[1];
您的代码如下所示:

java -cp jar-name.jar complete-class-name "2016" "08"
String year = args[0];
String month = args[1];

您可以使用
java
命令将参数传递给args,如下所示:

java -cp jar-name.jar complete-class-name "2016" "08"
String year = args[0];
String month = args[1];
您的代码如下所示:

java -cp jar-name.jar complete-class-name "2016" "08"
String year = args[0];
String month = args[1];

< >为了避免重新创建轮子和bug,你应该考虑使用一个类似的库来解析你的命令。< /P>
public static void main(final String[] args) {
    Options options = new Options();
    options.addOption(
        Option.builder("y")
            .required(true)
            .hasArg(true)
            .desc("The year")
            .longOpt("year")
            .build()
    );
    options.addOption(
        Option.builder("m")
            .required(true)
            .desc("The months")
            .numberOfArgs(Option.UNLIMITED_VALUES)
            .longOpt("month")
            .build()
    );
    CommandLineParser parser = new DefaultParser();
    CommandLine cmd;
    try {
        cmd = parser.parse(options, args);
    } catch (ParseException e) {
        System.err.println( "Could not parse the command due to: " + e.getMessage());
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp( "java", options );
        return;
    }
    String year = cmd.getOptionValue("y");
    String[] months = cmd.getOptionValues("m");
    // Rest of your code here
}
然后,您将能够在年份中使用
-y
--year
提供参数,在月份中使用
-m
--month
。如果出现解析错误,还将打印用法


如果要手动执行此操作(假设先有年份,然后是月份),则代码将为:

public static void main(final String[] args) {
    if (args.length < 2)
        throw new IllegalStateException("Not enough arguments");
    String year = args[0];
    String[] months = new String[args.length - 1];
    System.arraycopy(args, 1, months, 0, months.length);
    ...
}
publicstaticvoidmain(最终字符串[]args){
如果(参数长度<2)
抛出新的非法状态异常(“参数不足”);
字符串年份=args[0];
字符串[]个月=新字符串[args.length-1];
数组复制(args,1,月,0,月,长度);
...
}

<>但是我们应该添加更多的测试来保证参数的总数是正确的,并且参数是有效的,这就是为什么我建议使用一个库来代替.< /p> ,以避免重新创建轮子和bug,你应该考虑使用一个类似的库来为你正确地解析你的命令。
public static void main(final String[] args) {
    Options options = new Options();
    options.addOption(
        Option.builder("y")
            .required(true)
            .hasArg(true)
            .desc("The year")
            .longOpt("year")
            .build()
    );
    options.addOption(
        Option.builder("m")
            .required(true)
            .desc("The months")
            .numberOfArgs(Option.UNLIMITED_VALUES)
            .longOpt("month")
            .build()
    );
    CommandLineParser parser = new DefaultParser();
    CommandLine cmd;
    try {
        cmd = parser.parse(options, args);
    } catch (ParseException e) {
        System.err.println( "Could not parse the command due to: " + e.getMessage());
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp( "java", options );
        return;
    }
    String year = cmd.getOptionValue("y");
    String[] months = cmd.getOptionValues("m");
    // Rest of your code here
}
然后,您将能够在年份中使用
-y
--year
提供参数,在月份中使用
-m
--month
。如果出现解析错误,还将打印用法


如果要手动执行此操作(假设先有年份,然后是月份),则代码将为:

public static void main(final String[] args) {
    if (args.length < 2)
        throw new IllegalStateException("Not enough arguments");
    String year = args[0];
    String[] months = new String[args.length - 1];
    System.arraycopy(args, 1, months, 0, months.length);
    ...
}
publicstaticvoidmain(最终字符串[]args){
如果(参数长度<2)
抛出新的非法状态异常(“参数不足”);
字符串年份=args[0];
字符串[]个月=新字符串[args.length-1];
数组复制(args,1,月,0,月,长度);
...
}

但是我们应该添加更多的测试,以确保参数总量正确且参数有效,这就是我建议使用库的原因。

year=args[0]?命令行中的参数存储在主类
year=args[0]中的args数组中?命令行中的参数存储在主类中的args数组中,第二个参数为:String[]month=args[1]。拆分(“,”)并正常工作。:)将第二个参数设置为:String[]month=args[1]。拆分(“,”)并成功:解释很贴切。解释很贴切。