Jak analizować argumenty wiersza poleceń w Javie?

Jaki jest dobry sposób parsowania argumentów wiersza poleceń w Javie?

Author: Remko Popma, 2008-12-15

20 answers

Ostatnio wschodzącą gwiazdą jest picocli (kolory ANSI, autocompletion wiersza poleceń, zarówno adnotacje, jak i programmatic API i wiele innych).

Zobacz też te (starsze):

Or roll your own:


Na przykład, to jest jak ty użycie commons-cli aby przetworzyć 2 argumenty łańcuchowe:

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);

    }

}

Użycie z linii poleceń:

$> 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
 303
Author: Vinko Vrsalovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 08:43:23

Spójrz na nowszy JCommander .

Ja go stworzyłem. Chętnie otrzymuję pytania lub prośby o funkcje.

 281
Author: Cedric Beust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 19:01:37
 197
Author: lexicalscope,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 00:08:20

Użyłem JOpt i uznałem go za całkiem przydatny: http://jopt-simple.sourceforge.net/

Strona główna zawiera również listę około 8 alternatywnych bibliotek, sprawdź je i wybierz tę, która najbardziej odpowiada twoim potrzebom.

 22
Author: GaryF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 07:50:56

Ktoś wskazał mi ostatnio args4j który jest oparty na adnotacji. Bardzo mi się podoba!

 20
Author: André,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 12:39:44

Jest to biblioteka parsowania wiersza poleceń Google open-source jako część projektu Bazel. Osobiście uważam, że jest najlepszy na świecie i o wiele łatwiejszy niż Apache CLI.

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

Instalacja

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>

Użycie

Utwórz klasę, która rozszerza OptionsBase i definiuje twoje @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;

}

Przeanalizuj argumenty i użyj oni.

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

 8
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 00:09:58

Spójrz na projekt Commons CLI , dużo tam dobrych rzeczy.

 7
Author: Marc Novakowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 07:50:00

Maybe these

  • picocli "potężny mały interfejs wiersza poleceń" . Picocli jest biblioteką parserów argumentów wiersza poleceń dla Javy-z kolorową pomocą ANSI i uzupełnianiem wiersza poleceń. Na uwagę zasługują również zagnieżdżone podpowiedzi, szczegółowa instrukcja obsługi i możliwość dołączenia jako źródła, aby uniknąć w zależności od słoika picocli.
  • Parsowanie opcji linii poleceń JArgs suite for Java - Ten mały projekt zapewnia wygodny, kompaktowy, wstępnie zapakowany i kompleksowo udokumentowany zestaw parserów opcji wiersza poleceń do obsługi programistów Java. Początkowo dostarczane jest parsowanie zgodne z GNU-style 'getopt'.

  • Ritopt, ostateczny Parser opcji dla Javy - chociaż kilka standardów opcji linii poleceń zostało wstępnie skonfigurowanych, ritopt stosuje konwencje określone w pakiecie opt.

 7
Author: mepcotterell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 14:06:08

Yeap.

Myślę, że szukasz czegoś takiego: http://commons.apache.org/cli

Biblioteka Apache Commons CLI zapewnia API do przetwarzania interfejsów wiersza poleceń.

 6
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 07:51:38

Ten meta-artykuł o nieszczęściu może Cię zainteresować jako punkt wyjścia:

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

 6
Author: Alex Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 18:06:04

Kupić czy zbudować?

Wiele małych aplikacji podobnych do narzędzi prawdopodobnie wykonuje własne parsowanie wiersza poleceń, aby uniknąć dodatkowej zależności zewnętrznej.

Picocli może być interesujące. Jest przeznaczony do włączenia jako źródło jako prostsza alternatywa dla cieniowania słoików w uberjar.

Inną funkcją, która może Ci się spodobać, jest pomoc w użyciu kolorów.

Minimalna pomoc przy użyciu kolorów ANSI

Funkcje parsera:

  • adnotacja na podstawie: parsowanie jest jedną linijką kod
  • mocno wpisywane wszystko - opcje wiersza poleceń oraz parametry pozycyjne
  • POSIX clustered short options (<command> -xvfInputFile oraz <command> -x -v -f InputFile)
  • model arity, który pozwala na minimalną, maksymalną i zmienną liczbę parametrów, np., "1..*", "3..5"
  • Subkomands (może być zagnieżdżony do dowolnej głębokości)
  • [22]} Działa z Javą 5 i nowszymi [23]}

Komunikat pomocy w użytkowaniu można łatwo dostosować za pomocą adnotacji (bez programowania). Na przykład:

Rozszerzona pomoc w użytkowaniu (źródło)

Nie mogłem się oprzeć dodaniu jeszcze jednego zrzutu ekranu, aby pokazać, jakie wiadomości pomocy użytkowania są możliwe. Pomoc użytkowania jest twarzą Twojej aplikacji, więc bądź kreatywny i baw się dobrze!

picocli demo

Zastrzeżenie: stworzyłem picocli. Opinie lub pytania bardzo mile widziane.

 6
Author: Remko Popma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 05:17:05

Napisałem kolejny: http://argparse4j.sourceforge.net/

Argparse4j jest biblioteką parserów argumentów wiersza poleceń dla Javy, opartą na argparse Pythona.

 5
Author: Tatsuhiro Tsujikawa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 14:24:33
 5
Author: Ray Tayek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 00:07:39
 4
Author: cthiebaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 00:08:56

Nie polecam korzystania z biblioteki Apache Common CLI, ponieważ nie jest to threadsafe. Używa klas stateful ze statycznymi zmiennymi i metodami do wykonywania pracy wewnętrznej (np. OptionBuilder) i powinna być używana tylko w jednowątkowych, silnie kontrolowanych sytuacjach.

 2
Author: Jakub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-29 09:56:38

Wiem, że większość ludzi tutaj znajdzie 10 milionów powodów, dla których nie lubią mojego sposobu, ale nieważne. Lubię trzymać rzeczy proste, więc po prostu oddzielam klucz od wartości za pomocą ' = ' i przechowuję je w Hashmapie takim jak:

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

Zawsze możesz utrzymywać listę z argumentami, których oczekujesz, aby pomóc użytkownikowi na wypadek, gdyby zapomniał argumentu lub użył niewłaściwego... Jeśli jednak potrzebujesz zbyt wielu funkcji, To rozwiązanie i tak nie jest dla Ciebie.

 2
Author: John Koumarelas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 12:00:18

Jeśli chcesz czegoś lekkiego (rozmiar jar ~ 20 kb) i prostego w użyciu, możesz spróbować argument-parser. Może być używany w większości przypadków użycia, wspiera określanie tablic w argumencie i nie ma zależności od żadnej innej biblioteki. Działa dla Javy 1.5 lub nowszej. Poniższy fragment pokazuje przykład jak z niego korzystać:

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);
}

Więcej przykładów można znaleźć tutaj

 1
Author: Himanshu Shekhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 11:52:11

Argparse4j jest najlepszy jaki znalazłem. Naśladuje bibliotekę argparse Pythona, która jest bardzo wygodna i potężna.

 1
Author: Trismegistos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 00:10:52

Jako jeden z komentarzy wymienionych wcześniej ( https://github.com/pcj/google-options ) byłby dobrym wyborem na początek.

Jedna rzecz, którą chcę dodać to:

1) Jeśli napotkasz jakiś błąd odbicia parsera, spróbuj użyć nowszej wersji guava. w moim przypadku:

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) podczas uruchamiania wiersza poleceń:

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

3) Gdy potrzebujesz pomocy w użyciu, po prostu wpisz:

bazel run path/to/your:project -- --help
 0
Author: stevens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-26 08:29:18
 0
Author: PierluigiVernetto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 00:35:08