ฉันจะแยกอาร์กิวเมนต์บรรทัดคำสั่งใน Java ได้อย่างไร


586

เป็นวิธีที่ดีในการแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งใน Java คืออะไร?


4
ดู args4j และตัวอย่างโดยละเอียดเกี่ยวกับวิธีใช้: martin-thoma.com/how-to-parse-command-line-arguments-in-java
Martin Thoma

ดูเหมือนว่าฉันรักสายงานนี้ แต่ผมเขียนจัดการอาร์กิวเมนต์บรรทัดคำสั่งสำหรับ Java และวางไว้บน GitHub: MainArgsHandler สำหรับเธรดที่ถูกปิดฉันคิดว่านี่เป็นเธรดที่มีประโยชน์มาก แต่ควรย้ายไปยังไซต์ Stack Exchange โปรแกรมเมอร์สำหรับการสนทนาการเขียนโปรแกรมทั่วไป
Bobulous

@RedGlyph - ดูเหมือนว่า SO / SE ต้องทำให้กฎของพวกเขาง่ายขึ้น คำถามน่าจะเป็น: How to parse java command line arguments?. แต่ไม่มีใครอยากเขียนรหัสเพื่อทำสิ่งนี้ แต่ใช้เครื่องมือ แต่การค้นหาเครื่องมือและสิ่งที่ชอบนั้นไม่สร้างสรรค์ :(
AlikElzin-kilaka

6
โหวตให้เปิดใหม่ @AlikElzin: แน่นอนพวกเขาจำเป็นต้องตรวจสอบกระบวนการกลั่นกรองของพวกเขา ฉันสงสัยว่ามีตราสำหรับการปิดคำถามมากมายและมันล่อลวงผู้อยากเป็นโมเดอเรเตอร์
RedGlyph

8
คำถามนี้เป็น honeypot สำหรับคำตอบที่ไม่ดี / หนึ่งบรรทัดและคำแนะนำเครื่องมือ มันควรจะยังคงปิด
JAL

คำตอบ:


405

ลองดูสิ

หรือหมุนของคุณเอง:


ตัวอย่างเช่นนี่คือวิธีที่คุณใช้commons-cliในการแยกวิเคราะห์อาร์กิวเมนต์ของสตริง 2:

import org.apache.commons.cli.*;

public class Main {


    public static void main(String[] args) throws Exception {

        Options options = new Options();

        Option input = new Option("i", "input", true, "input file path");
        input.setRequired(true);
        options.addOption(input);

        Option output = new Option("o", "output", true, "output file");
        output.setRequired(true);
        options.addOption(output);

        CommandLineParser parser = new DefaultParser();
        HelpFormatter formatter = new HelpFormatter();
        CommandLine cmd;

        try {
            cmd = parser.parse(options, args);
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            formatter.printHelp("utility-name", options);

            System.exit(1);
        }

        String inputFilePath = cmd.getOptionValue("input");
        String outputFilePath = cmd.getOptionValue("output");

        System.out.println(inputFilePath);
        System.out.println(outputFilePath);

    }

}

การใช้งานจากบรรทัดคำสั่ง:

$> java -jar target/my-utility.jar -i asd                                                                                       
Missing required option: o

usage: utility-name
 -i,--input <arg>    input file path
 -o,--output <arg>   output file

40
โปรดทราบว่าไม่เหมือนกับไลบรารี Apache อื่น ๆ อีกมากมาย Apache CLI ไม่มีการอ้างอิง
Vladimir Dyuzhev

9
ข้อเสียอย่างหนึ่งของโครงการอาปาเช่คอมมอนส์หลายโครงการคือพวกเขาได้รับผลตอบแทนที่น้อยลงเรื่อย ๆ และท้ายที่สุดก็ล้าสมัย
Brett Ryan

4
นี่คือหน้า "สถานการณ์การใช้งาน" สำหรับโครงการ Apache CLI โดยมีรายละเอียดวิธีเริ่มใช้อย่างรวดเร็ว: commons.apache.org/cli/usage.html
Brad Parks

ฉันไม่คิดว่ามีหนึ่งเหมือน Args4J / JCommander ยกเว้นที่คุณกำหนดส่วนต่อประสานและอธิบายวิธีการหรือไม่ ฉันไม่เคยได้รับสามารถที่จะเติบโตรักของชั้นเรียนที่ "ผี Initialise" เขตข้อมูลส่วนตัว ...
Trejkaz

5
@RemkoPopma ห้องสมุด picocli ของคุณดูดีมากและขอขอบคุณที่ทำมันจริงๆ แต่ฉันคิดว่าคุณกำลังทำอะไรที่นี่และในโพสต์อื่น ๆ (แก้ไขคำตอบที่ได้รับการยอมรับและโปรโมตห้องสมุดของคุณที่ด้านบนสุดโดยไม่ต้องเปิดเผยแม้จะเป็นการแก้ไขไม่ใช่จากผู้เขียนต้นฉบับของโพสต์ การตั้งค่าสถานะนี้เพื่อ mods อื่น ๆ
Alexander Malakhov

312

ดูJCommander ที่ใหม่กว่า

ฉันสร้างมันขึ้นมา ฉันยินดีรับคำถามหรือขอคุณสมบัติ


7
ดีใจที่คุณชอบ JCommander :-) ฉันไม่ต้องการเพิ่มความหมายมากเกินไปกับวิธีปฏิบัติต่อการตั้งค่าสถานะดังนั้นคุณต้องเพิ่มคำพ้องความหมายในคำอธิบายประกอบที่คุณใช้: @ พารามิเตอร์ (ชื่อ = {"-h", "- - ช่วย "}) ฉันคิดว่ามันเป็นการประนีประนอมที่สมเหตุสมผล
Cedric Beust

14
เครื่องมือที่ยอดเยี่ยม ทรงพลังยืดหยุ่นและคุณไม่ต้องจัดการกับตัวแยกวิเคราะห์แบบดั้งเดิมที่น่ารำคาญ
IanGilham

3
ใช่ฉันคิดว่าฉันจะเขียนตัวแยกวิเคราะห์บรรทัดคำสั่งของตัวเองแบบเดียวกับที่คุณเขียน JCommander การทำงานที่ดี.
SRG

9
@CedricBeust นี่เป็นห้องสมุดที่ยอดเยี่ยมฉันขอบคุณมาก เนื่องจากเราสามารถกำหนดคลาส Args ของเราเองที่สามารถส่งผ่านโดยไม่ต้องพึ่งพาคลาสไลบรารีใด ๆ จึงทำให้มีความยืดหยุ่นอย่างมาก
Brett Ryan

2
พัดการแข่งขันออกมาจากน้ำ!
Marcus Junius Brutus

235

7
@Ben Flynn hehe มีบางอย่างที่น่าแปลกใจและน่าสนใจล้ออยู่ในนั้น ฉันคิดว่ามันเป็นวิธีที่อันตรายที่สุดในการแสดงว่ามีมากกว่าหนึ่งวิธีที่จะทำ!
lexicalscope

14
ฉันสังเกตผู้เขียนของ JOpt Simple รักษารายการที่คล้ายกันมาก! สิ่งที่เราต้องการข้อความคือการเปลี่ยนรายการเหล่านี้ลงในตารางรายการคุณสมบัติและจุดที่น่าสนใจเพื่อให้เราผู้ใช้ที่ยากจนสามารถตัดสินใจได้อย่างชาญฉลาด
Tom Anderson

1
ฉันได้สร้างRop - github.com/ryenus/ropซึ่งให้บริการโซลูชันตามคำอธิบายประกอบที่คุณประกาศคำสั่งและตัวเลือกผ่านคลาสและฟิลด์ธรรมดาซึ่งเป็นวิธีการประกาศตัวสร้างตัวแยกวิเคราะห์บรรทัดคำสั่ง มันสามารถสร้าง Git (single-cmd) หรือ Maven (multi-cmd) เช่นแอพ
ryenus

8
โครงการส่วนใหญ่ที่ระบุไว้ส่วนใหญ่จะเป็นการละทิ้งซอฟต์แวร์ หลังจากผ่านรายการฉันจะบอกว่าน่าเกรงขามขนาดใหญ่ที่ได้รับการดูแลและเป็นที่นิยมดูเหมือนจะคอมมอนส์ - cli, jcommander, args4j, jopt-simple และ picocli ขอโทษผู้เขียนของสิ่งต่าง ๆ เช่น argparse4j และ cli-parser - ฉันต้องทำการจัดอันดับตามอำเภอใจและเลือกห้าอันดับแรกโครงการอื่น ๆ ในรายการที่ชัดเจนเป็นที่นิยมและยังอยู่ภายใต้การพัฒนาที่กระตือรือร้น
George Hawkins

2
ฉันท้าทายคนที่จะรวมวันที่ของการแยกวิเคราะห์แต่ละครั้งที่เสถียร
เลื่อน

50

มันเป็นปี 2020 เวลาในการทำดีกว่า Commons CLI ... :-)

คุณควรสร้างตัวแยกวิเคราะห์บรรทัดคำสั่ง Java ของคุณเองหรือใช้ไลบรารี?

แอปพลิเคชันที่มีลักษณะคล้ายยูทิลิตี้ขนาดเล็กจำนวนมากอาจม้วนการแยกบรรทัดคำสั่งของตนเองเพื่อหลีกเลี่ยงการพึ่งพาภายนอกเพิ่มเติม picocliอาจเป็นทางเลือกที่น่าสนใจ

Picocli เป็นห้องสมุดที่ทันสมัยและกรอบการทำงานสำหรับการสร้างแอพบรรทัดคำสั่งที่ใช้งานง่ายและมีประสิทธิภาพ GraalVM ที่ใช้งานง่าย มันอาศัยอยู่ในไฟล์ต้นฉบับ 1 ไฟล์เพื่อให้แอปสามารถรวมเป็นแหล่งที่มาเพื่อหลีกเลี่ยงการเพิ่มการพึ่งพา

รองรับสีการเติมข้อความอัตโนมัติคำสั่งย่อยและอื่น ๆ เขียนใน Java สามารถใช้งานได้จาก Groovy, Kotlin, Scala และอื่น ๆ

ความช่วยเหลือในการใช้งานน้อยที่สุดด้วยสี ANSI

คุณสมบัติ:

  • คำอธิบายประกอบตาม: ประกาศ , หลีกเลี่ยงการทำสำเนาและเป็นการแสดงออกโปรแกรมเมอร์เจตนา
  • สะดวก: แยกวิเคราะห์ผู้ใช้และเรียกใช้ตรรกะทางธุรกิจของคุณด้วยรหัสหนึ่งบรรทัด
  • พิมพ์ทุกอย่างมาก - ตัวเลือกบรรทัดคำสั่งรวมถึงพารามิเตอร์ตำแหน่ง
  • ตัวเลือกแบบสั้นของคลัสเตอร์ POSIX ( <command> -xvfInputFileรวมถึง<command> -x -v -f InputFile)
  • การควบคุมแบบละเอียด : โมเดล arity ที่อนุญาตจำนวนพารามิเตอร์ต่ำสุด, สูงสุดและตัวแปรเช่น"1..*",,"3..5"
  • คำสั่งย่อย (สามารถซ้อนกันเป็นความลึกโดยพลการ)
  • มีคุณลักษณะหลากหลาย : กลุ่ม arg แบบเรียงต่อได้, การแยก args ที่อ้างอิง, คำสั่งย่อยที่ทำซ้ำได้และอื่น ๆ
  • ใช้งานง่าย : ข้อความช่วยเหลือการใช้งานใช้สีเพื่อตัดกันองค์ประกอบที่สำคัญเช่นชื่อตัวเลือกจากส่วนที่เหลือของการใช้งานช่วยลดภาระการรับรู้ของผู้ใช้
  • แจกจ่ายแอปของคุณเป็นรูปภาพดั้งเดิมของ GraalVM
  • ทำงานร่วมกับJava 5และสูงกว่า
  • เอกสารที่กว้างขวางและพิถีพิถัน

ข้อความช่วยเหลือการใช้งานนั้นง่ายต่อการปรับแต่งด้วยหมายเหตุประกอบ (ไม่มีการตั้งโปรแกรม) ตัวอย่างเช่น:

ข้อความช่วยเหลือการใช้งานเพิ่มเติม(ที่มา )

ฉันไม่สามารถต้านทานการเพิ่มภาพหน้าจออีกหนึ่งภาพเพื่อแสดงว่าข้อความช่วยเหลือการใช้งานเป็นไปได้อย่างไร ความช่วยเหลือในการใช้คือหน้าใบสมัครของคุณดังนั้นจงสร้างสรรค์และสนุก!

การสาธิต picocli

คำเตือน: ฉันสร้าง picocli ข้อเสนอแนะหรือคำถามยินดีต้อนรับมาก


5
อัจฉริยะบริสุทธิ์! น่าเสียดายที่คำตอบนี้ถูกฝังอยู่ที่ด้านล่าง Apache Commons CLI เป็น verbose, buggy และไม่ได้รับการอัพเดตในเวลานาน และฉันไม่ต้องการใช้ตัวแยกวิเคราะห์ CLI ของ Google เพราะฉันไม่ต้องการโฆษณาเป้าหมายตามประวัติการใช้อาร์กิวเมนต์บรรทัดคำสั่งของฉัน แต่มันดู verbose มากกว่า picocli เล็กน้อยอยู่ดี
Pete

2
ฉันสอง @Pete ที่นี่ ... ฉันผ่านรายการด้านบนซึ่งเป็นการเสียเวลาโดยสิ้นเชิงกับสิ่งเหล่านี้ที่ฝังอยู่ที่ด้านล่าง นี่ควรเป็นคำตอบยอดนิยมหนึ่งไมล์ เยี่ยมมาก! ความต้องการของฉันไม่สามารถครอบคลุมโดย apache CLI หรือตัวแยกวิเคราะห์อื่น ๆ เหล่านี้ส่วนใหญ่ พวกเขาท้าทายแม้กระทั่ง picocli แต่ก็สามารถให้สิ่งที่ใกล้เคียงกับไวยากรณ์ / พฤติกรรมที่ฉันต้องการและมีความยืดหยุ่นเพียงพอที่จะแฮ็กสิ่งที่ฉันต้องการจริงๆ ในฐานะโบนัสมันยอดเยี่ยมมากสำหรับ ANSI
Shai Almog

@ShaiAlmog คำตอบที่ได้รับการโหวตสูงสุดคืออายุ 10 ปีและล้าสมัย ฉันเห็นด้วยที่แนะนำ Commons CLI ในปี 2019 ทำให้เข้าใจผิด IMHO โปรดพิจารณาการเขียนคำตอบใหม่เพื่อให้ทันสมัยยิ่งขึ้น
Remko Popma

ฉันเห็นว่าคุณได้ลองแล้วฉันไม่คิดว่ามันจะได้ผลสำหรับฉันเช่นกัน ... ถ้าคุณเลือกชื่อเช่น 1Picoli เราสามารถเรียงลำดับคำตอบที่ 3 ตามตัวอักษร ;-)
Shai Almog

ฉันคิดว่าเหตุผลที่การเปลี่ยนแปลงของฉันกลับคืนมาคือฉันไม่ได้เปิดเผยการติดต่อของฉัน (ฉันเป็นผู้เขียน) คนอื่นไม่ควรมีปัญหานั้น
Remko Popma

23

ฉันใช้ JOpt แล้วพบว่ามันค่อนข้างมีประโยชน์: http://jopt-simple.sourceforge.net/

หน้าแรกยังมีรายการของห้องสมุดอื่นอีก 8 แห่งตรวจสอบและเลือกห้องสมุดที่ตรงกับความต้องการของคุณมากที่สุด


21

มีคนชี้ให้ฉันดูargs4jเมื่อเร็ว ๆ นี้ซึ่งมีคำอธิบายประกอบ ฉันชอบมันมาก!


1
+1 สำหรับ Args4J! เป็นมิตรกับมนุษย์มีความยืดหยุ่นและเข้าใจได้ง่าย ฉันคิดว่ามันควรจะเป็นห้องสมุดมาตรฐานสำหรับการสร้างแอพพลิเคชั่น Java CLI
Zearin

ยอดเยี่ยมที่สามารถจัดการกับการพิมพ์การใช้งานเรียงลำดับ (เรียงตามลำดับฟิลด์) ที่ JCommander ไม่สามารถทำได้และมีความยืดหยุ่นมากกว่า
Daniel Hári

@ DanielHáriสำหรับข้อมูลฟังก์ชั่นนี้เพิ่มเข้ามาใน JCommander (บางช่วงปลายเดือนกุมภาพันธ์ 2017)
นาธาน

9

นี่คือห้องสมุดแยกบรรทัดคำสั่งของ Google ที่มาเปิดเป็นส่วนหนึ่งของโครงการ Bazel โดยส่วนตัวฉันคิดว่าเป็นสิ่งที่ดีที่สุดและง่ายกว่า Apache CLI

https://github.com/pcj/google-options

การติดตั้ง

Bazel

maven_jar(
    name = "com_github_pcj_google_options",
    artifact = "com.github.pcj:google-options:jar:1.0.0",
    sha1 = "85d54fe6771e5ff0d54827b0a3315c3e12fdd0c7",
)

Gradle

dependencies {
  compile 'com.github.pcj:google-options:1.0.0'
}

Maven

<dependency>
  <groupId>com.github.pcj</groupId>
  <artifactId>google-options</artifactId>
  <version>1.0.0</version>
</dependency>

การใช้

สร้างคลาสที่ขยายOptionsBaseและกำหนด@Option(s) ของคุณ

package example;

import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;

import java.util.List;

/**
 * Command-line options definition for example server.
 */
public class ServerOptions extends OptionsBase {

  @Option(
      name = "help",
      abbrev = 'h',
      help = "Prints usage info.",
      defaultValue = "true"
    )
  public boolean help;

  @Option(
      name = "host",
      abbrev = 'o',
      help = "The server host.",
      category = "startup",
      defaultValue = ""
  )
  public String host;

  @Option(
    name = "port",
    abbrev = 'p',
    help = "The server port.",
    category = "startup",
    defaultValue = "8080"
    )
    public int port;

  @Option(
    name = "dir",
    abbrev = 'd',
    help = "Name of directory to serve static files.",
    category = "startup",
    allowMultiple = true,
    defaultValue = ""
    )
    public List<String> dirs;

}

แยกข้อโต้แย้งและใช้พวกเขา

package example;

import com.google.devtools.common.options.OptionsParser;
import java.util.Collections;

public class Server {

  public static void main(String[] args) {
    OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class);
    parser.parseAndExitUponError(args);
    ServerOptions options = parser.getOptions(ServerOptions.class);
    if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) {
      printUsage(parser);
      return;
    }

    System.out.format("Starting server at %s:%d...\n", options.host, options.port);
    for (String dirname : options.dirs) {
      System.out.format("\\--> Serving static files at <%s>\n", dirname);
    }
  }

  private static void printUsage(OptionsParser parser) {
    System.out.println("Usage: java -jar server.jar OPTIONS");
    System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(),
                                              OptionsParser.HelpVerbosity.LONG));
  }

}

https://github.com/pcj/google-options


สวัสดีพอล เมื่อฉันอ่านคำตอบของคุณหรือเอกสารโครงการของคุณฉันไม่มีความคิดใด ๆ ที่บรรทัดคำสั่งนั้นสามารถจัดการได้ ตัวอย่างเช่นคุณอาจให้อะไรเช่นmyexecutable -c file.json -d 42 --outdir ./outนั้น และฉันไม่เห็นวิธีที่คุณกำหนดตัวเลือกสั้น / ยาว / คำอธิบาย ... ไชโย
โอลิเบร


8

Yeap

ฉันคิดว่าคุณกำลังมองหาสิ่งนี้: http://commons.apache.org/cli

ไลบรารี Apache Commons CLI จัดเตรียม API สำหรับการประมวลผลอินเตอร์เฟสบรรทัดคำสั่ง


7

ฉันรู้ว่าคนส่วนใหญ่ที่นี่จะหาเหตุผล 10 ล้านเหตุผลที่พวกเขาไม่ชอบวิธีของฉัน แต่ไม่เป็นไร ฉันชอบที่จะทำให้สิ่งต่าง ๆ เรียบง่ายดังนั้นฉันเพิ่งแยกกุญแจออกจากค่าโดยใช้ '=' และเก็บไว้ใน HashMap ดังนี้:

Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
    String[] parts = arg.split("=");
    argsMap.put(parts[0], parts[1]);
} 

คุณสามารถรักษารายการที่มีข้อโต้แย้งที่คุณต้องการเพื่อช่วยผู้ใช้ในกรณีที่เขาลืมข้อโต้แย้งหรือใช้รายการผิด ... อย่างไรก็ตามถ้าคุณต้องการคุณสมบัติมากเกินไปวิธีนี้ไม่ได้แก้ปัญหาสำหรับคุณ


7

อาจจะเป็นเหล่านี้


6

คุณอาจพบว่า meta-article นี้เป็นเรื่องน่าเศร้าที่น่าสนใจในฐานะจุดกระโดด:

http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html


2
ผู้ชายคนนั้นค่อนข้างไร้ประโยชน์ "Commons CLI เห็นได้ชัดว่าเป็นตัวเลือกที่เก่าแก่ที่สุดที่นี่และไม่ได้รับความเคารพจากผู้แสดงความคิดเห็นมากนักดังนั้นฉันจึงไม่ได้มองอย่างใกล้ชิดเลย .. " แต่ขอบคุณสำหรับลิงค์
James McMahon

5

ฉันเขียนอีกอันหนึ่ง: http://argparse4j.sourceforge.net/

Argparse4j เป็นไลบรารีตัวแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งสำหรับ Java โดยอิงตาม Python ของอาร์กิวเมนต์


ยินดีต้อนรับสู่ Stack Overflow! ขอบคุณสำหรับการโพสต์คำตอบของคุณ! โปรดอ่านคำถามที่พบบ่อยเกี่ยวกับการส่งเสริมตนเองอย่างรอบคอบ
Andrew Barber



4

หากคุณใช้ Spring Boot อยู่แล้วการแยกการโต้แย้งออกมาจากกล่อง

หากคุณต้องการรันบางสิ่งหลังจากเริ่มทำงานให้ใช้ApplicationRunnerอินเตอร์เฟส:

@SpringBootApplication
public class Application implements ApplicationRunner {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(ApplicationArguments args) {
    args.containsOption("my-flag-option"); // test if --my-flag-option was set
    args.getOptionValues("my-option");     // returns values of --my-option=value1 --my-option=value2 
    args.getOptionNames();                 // returns a list of all available options
    // do something with your args
  }
}

runวิธีการของคุณจะถูกเรียกใช้หลังจากบริบทเริ่มต้นได้สำเร็จ

หากคุณต้องการเข้าถึงอาร์กิวเมนต์ก่อนที่คุณจะเริ่มบริบทแอปพลิเคชันของคุณคุณก็สามารถแยกอาร์กิวเมนต์แอปพลิเคชันด้วยตนเองได้:

@SpringBootApplication
public class Application implements ApplicationRunner {

  public static void main(String[] args) {
    ApplicationArguments arguments = new DefaultApplicationArguments(args);
    // do whatever you like with your arguments
    // see above ...
    SpringApplication.run(Application.class, args);
  }

}

และสุดท้ายหากคุณต้องการเข้าถึงการโต้แย้งของคุณในถั่วเพียงแค่ฉีดApplicationArguments:

@Component
public class MyBean {

   @Autowired
   private ApplicationArguments arguments;

   // ...
}

นี่มันเจ๋งมาก :).
John Humphreys - w00te

3

Argparse4j เป็นสิ่งที่ดีที่สุดที่ฉันได้พบ มันเลียนแบบ libparse argparse ของ Pyth ซึ่งสะดวกและมีประสิทธิภาพมาก


2

ถ้าคุณต้องการสิ่งที่มีน้ำหนักเบา (ขวดขนาด ~ 20 KB) และง่ายต่อการใช้งานคุณสามารถลองอาร์กิวเมนต์ parser สามารถใช้ในกรณีการใช้งานส่วนใหญ่รองรับการระบุอาร์เรย์ในอาร์กิวเมนต์และไม่ต้องพึ่งพาไลบรารีอื่น มันใช้งานได้กับ Java 1.5 หรือสูงกว่า ข้อความที่ตัดตอนมาด้านล่างแสดงตัวอย่างเกี่ยวกับวิธีใช้:

public static void main(String[] args) {
    String usage = "--day|-d day --mon|-m month [--year|-y year][--dir|-ds directoriesToSearch]";
    ArgumentParser argParser = new ArgumentParser(usage, InputData.class);
    InputData inputData = (InputData) argParser.parse(args);
    showData(inputData);

    new StatsGenerator().generateStats(inputData);
}

ตัวอย่างเพิ่มเติมสามารถพบได้ที่นี่


1
ลิงค์เสียชีวิต คุณฆ่าคุณฉาย? :-(
beldaz

2

ฉันจะไม่แนะนำให้ใช้Apache Common CLIห้องสมุดเพราะมันไม่ได้เป็น threadsafe

มันใช้คลาส statefulty กับตัวแปรคงที่และวิธีการที่จะทำงานภายใน (เช่นOptionBuilder) และควรจะใช้ในสถานการณ์ที่ควบคุมอย่างเดียวเธรดเดียว


18
เป็นเรื่องที่ดีที่ควรทราบว่าห้องสมุด CLI นั้นไม่ปลอดภัยสำหรับเธรด อย่างไรก็ตามฉันคิดว่าการแยกวิเคราะห์บรรทัดคำสั่งมักจะทำในเธรดเดียวระหว่างการเริ่มต้นแอปพลิเคชันและจากนั้นขึ้นอยู่กับพารามิเตอร์เธรดอื่นอาจเริ่มทำงาน
Alexey Ivanov

0

เป็นหนึ่งในความคิดเห็นที่กล่าวถึงก่อนหน้า ( https://github.com/pcj/google-options ) จะเป็นตัวเลือกที่ดีในการเริ่มต้น

สิ่งหนึ่งที่ฉันต้องการเพิ่มคือ:

1) หากคุณพบข้อผิดพลาดในการแยกวิเคราะห์ข้อความโปรดลองใช้ฝรั่งรุ่นใหม่ ในกรณีของฉัน:

maven_jar(
    name = "com_google_guava_guava",
    artifact = "com.google.guava:guava:19.0",
    server = "maven2_server",
)

maven_jar(
    name = "com_github_pcj_google_options",
    artifact = "com.github.pcj:google-options:jar:1.0.0",
    server = "maven2_server",
)

maven_server(
    name = "maven2_server",
    url = "http://central.maven.org/maven2/",
)

2) เมื่อเรียกใช้ commandline:

bazel run path/to/your:project -- --var1 something --var2 something -v something

3) เมื่อคุณต้องการความช่วยเหลือในการใช้งานเพียงพิมพ์:

bazel run path/to/your:project -- --help

-1

สำหรับผู้ใช้สปริงเราควรพูดถึงhttps://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/SimpleCommandLinePropertySource.html และพี่ชายฝาแฝดของเขาด้วยhttps: //docs.spring .io / spring / docs / current / javadoc-api / org / springframework / core / env / JOptCommandLinePropertySource.html (การนำไปปฏิบัติของฟังก์ชั่นเดียวกัน) ข้อดีในฤดูใบไม้ผลิคือคุณสามารถผูกอาร์กิวเมนต์บรรทัดคำสั่งกับแอตทริบิวต์ได้โดยตรงมีตัวอย่างที่นี่https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/ CommandLinePropertySource.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.