Opdrachtregelparameters parseren met luchtvaartmaatschappij

1. Inleiding

In deze tutorial we introduceren Airline - een annotatiegestuurde Java-bibliotheek voor het bouwen van Command-Line Interfaces (CLI's).

2. Scenario

Bij het bouwen van een opdrachtregeltoepassing is het normaal om een ​​eenvoudige interface te maken waarmee de gebruiker de uitvoer naar behoefte kan aanpassen. Bijna iedereen heeft met Git CLI gespeeld en kan zich vertellen hoe krachtig, maar toch eenvoudig, het is. Helaas zijn er maar weinig tools die van pas komen bij het bouwen van zo'n interface.

De luchtvaartmaatschappijis bedoeld om de standaardcode te verminderen die doorgaans wordt geassocieerd met CLI's in Java, aangezien de meest voorkomende gedragingen kunnen worden bereikt met annotaties en nul gebruikerscode.

We gaan een klein Java-programma implementeren dat de functionaliteiten van Airline zal gebruiken om een ​​gemeenschappelijke CLI na te bootsen. Het geeft gebruikersopdrachten weer voor het instellen van onze programmaconfiguratie, zoals het definiëren van de database-URL, inloggegevens en uitgebreidheid van de logger. We duiken ook onder de oppervlakte van onze bibliotheek en gebruiken meer dan de basisprincipes om te onderzoeken of het enige complexiteit aankan.

3. Installatie

Laten we om te beginnen de luchtvaartmaatschappij-afhankelijkheid toevoegen aan onze pom.xml:

 com.github.rvesse luchtvaartmaatschappij 2.7.2 

4. Een eenvoudige CLI

Laten we ons toegangspunt voor de applicatie maken - het Opdrachtregel klasse:

@Cli (name = "baeldung-cli", description = "Baeldung Airline Tutorial", defaultCommand = Help.class) public class CommandLine {public static void main (String [] args) {Cli cli = new Cli (CommandLine.class) ; Uitvoerbare cmd = cli.parse (args); cmd.run (); }}

Door middel van een simpele @Cli annotatie hebben we het standaardcommando gedefinieerd dat op onze applicatie zal worden uitgevoerd - het Helpen opdracht.

De Helpen class komt als onderdeel van de Airline-bibliotheek en geeft een standaard help-commando weer met -h of -helpen opties.

Zo is de basisconfiguratie voltooid.

5. Ons eerste commando

Laten we ons eerste commando implementeren, een simpel LoggingCommand klasse die de breedsprakigheid van onze logboeken zal regelen. We zullen de klas annoteren met @Opdracht om ervoor te zorgen dat de juiste opdracht wordt toegepast wanneer de gebruiker belt setup-logboek:

@Command (name = "setup-log", description = "Stel ons logboek in") openbare klasse LoggingCommand implementeert Runnable {@Inject private HelpOption-hulp; @Option (name = {"-v", "--verbose"}, description = "Log uitgebreidheid aan / uit zetten") private boolean verbose = false; @Override public void run () {if (! Help.showHelpIfRequested ()) System.out.println ("Breedsprakigheid:" + uitgebreid); }}}

Laten we ons voorbeeldcommando eens nader bekijken.

Ten eerste hebben we een beschrijving ingesteld zodat onze helper, dankzij de injectie, onze commando-opties zal tonen wanneer daarom wordt gevraagd.

Toen verklaarden we een boolean variabel, uitgebreid, en annoteerde het met @Keuze om het een naam, beschrijving en ook een alias te geven -v / –verbose om onze opdrachtregeloptie weer te geven om breedsprakigheid te beheren.

Eindelijk, binnen het rennen methode, hebben we ons commando opgedragen om te stoppen wanneer de gebruiker om hulp vraagt.

Tot nu toe zo goed. Nu moeten we onze nieuwe opdracht toevoegen aan de hoofdinterface door de @ te wijzigenCli annotatie:

@Cli (name = "baeldung-cli", description = "Baeldung Airline Tutorial", defaultCommand = Help.class, commands = {LoggingCommand.class, Help.class}) public class CommandLine {public static void main (String [] args ) {Cli cli = nieuwe Cli (CommandLine.class); Uitvoerbare cmd = cli.parse (args); cmd.run (); }} 

Nu, als we slagen setup-log -v aan ons programma, zal het onze logica uitvoeren.

6. Beperkingen en meer

We hebben gezien hoe Airline foutloos CLI genereert, maar… er is meer!

We kunnen beperkingen (of beperkingen) specificeren voor onze parameters om toegestane waarden, vereisten of afhankelijkheden en meer af te handelen.

We gaan een DatabaseSetupCommand klasse, die zal reageren op de setup-db opdracht; hetzelfde als eerder, maar we voegen wat pit toe.

Eerst vragen we om het type database, waarbij we slechts 3 geldige waarden accepteren tot en met @AllowedRawValues:

@AllowedRawValues ​​(toegestaanValues ​​= {"mysql", "postgresql", "mongodb"}) @Option (type = OptionType.COMMAND, naam = {"-d", "--database"}, description = "Type RDBMS. ", title =" RDBMS-type: mysql | postgresql | mongodb ") beschermde String rdbmsMode;

Bij gebruik van een databaseverbinding moeten gebruikers ongetwijfeld een eindpunt en enkele referenties opgeven om er toegang toe te krijgen. We laten CLI dit afhandelen via één (URL-modus) of meer parameters (host-modus). Hiervoor gebruiken we de @MutuallyExclusiveWith annotatie, waarbij elke parameter met dezelfde tag wordt gemarkeerd:

@Option (type = OptionType.COMMAND, name = {"--rdbms: url", "--url"}, description = "URL die moet worden gebruikt voor verbinding met RDBMS.", Title = "RDBMS URL") @MutuallyExclusiveWith ( tag = "mode") @Pattern (pattern = "^ (//.*) :( d *) (. *) u = (. *) & p = (. *)") beschermde String rdbmsUrl = ""; @Option (type = OptionType.COMMAND, name = {"--rdbms: host", "--host"}, description = "Host om te gebruiken voor verbinding met RDBMS.", Title = "RDBMS host") @MutuallyExclusiveWith ( tag = "mode") protected String rdbmsHost = ""; 

Merk op dat we de @Patroon decorator, waarmee we de indeling van de URL-tekenreeks kunnen definiëren.

Als we naar de projectdocumentatie kijken, zullen we andere vinden waardevolle tools voor het afhandelen van vereisten, gebeurtenissen, toegestane waarden, specifieke gevallen en meer, waardoor we onze aangepaste regels kunnen definiëren.

Ten slotte, als de gebruiker de hostmodus heeft geselecteerd, moeten we hem vragen om zijn inloggegevens op te geven. Op deze manier is de ene optie afhankelijk van de andere. We kunnen dit gedrag bereiken met de @BuienRadarNL annotatie:

@RequiredOnlyIf (names = {"- rdbms: host", "--host"}) @Option (type = OptionType.COMMAND, naam = {"--rdbms: user", "-u", "--user "}, description =" Gebruiker om in te loggen op RDBMS. ", title =" RDBMS-gebruiker ") beschermde String rdbmsUser; @RequiredOnlyIf (names = {"- rdbms: host", "--host"}) @Option (type = OptionType.COMMAND, naam = {"--rdbms: wachtwoord", "--password"}, description = "Wachtwoord om in te loggen op RDBMS.", Title = "RDBMS-wachtwoord") beschermd String rdbmsPassword; 

Wat als we enkele stuurprogramma's moeten gebruiken om de DB-verbinding af te handelen? En stel ook dat we meer dan één waarde in een enkele parameter moeten ontvangen. We kunnen het type optie gewoon wijzigen in OptionType.ARGUMENTS of - nog beter - accepteer een lijst met waarden:

@Option (type = OptionType.COMMAND, name = {"--driver", "--jars"}, description = "Lijst met stuurprogramma's", title = "--driver --driver") protected List jars = nieuwe ArrayList ();

Laten we nu niet vergeten de opdracht voor database-instellingen toe te voegen aan onze hoofdklasse. Anders is het niet beschikbaar op CLI.

7. Rennen

We hebben het gedaan! We hebben ons project voltooid en nu kunnen we het uitvoeren.

Zoals verwacht, zonder parameters door te geven, Helpen wordt aangeroepen:

$ baeldung-cli gebruik: baeldung-cli [] Commando's zijn: help Help-informatie weergeven setup-db Onze database instellen setup-log Ons logboek instellen Zie 'baeldung-cli help' voor meer informatie over een specifiek commando.

Als we in plaats daarvan uitvoeren setup-log –help, we krijgen:

$ baeldung-cli setup-log --help NAAM baeldung-cli setup-log - Stel ons log in SYNOPSIS baeldung-cli setup-log [-h] [-v] OPTIES -h, --help Help-informatie weergeven -v, - -verbose Zet log uitgebreidheid aan / uit

Ten slotte zal het leveren van parameters aan deze opdrachten de juiste bedrijfslogica uitvoeren.

8. Conclusie

In dit artikel hebben we een eenvoudige maar krachtige opdrachtregelinterface gebouwd met heel weinig codering.

De Airline-bibliotheek, met zijn krachtige functionaliteiten, vereenvoudigt de CLI en biedt ons een algemene, schone en herbruikbare infrastructuur. Het stelt ons, ontwikkelaars, in staat om ons te concentreren op onze bedrijfslogica in plaats van tijd te besteden aan het ontwerpen van wat triviaal zou moeten zijn.

Zoals altijd is de code te vinden op GitHub.