Προγραμματισμός

Ανάλυση γραμμής εντολών με Apache Commons CLI

Από καιρό σε καιρό, θεωρώ ότι πρέπει να χειριστώ επιχειρήματα γραμμής εντολών στην Java είτε για εφαρμογές που βασίζονται σε Java είτε για εφαρμογές βασικής λειτουργίας () που παρέχουν έναν απλό μηχανισμό δοκιμών απευθείας στην τάξη που δοκιμάζεται. Ο προγραμματιστής Java έχει πολλές επιλογές για ανάλυση γραμμής εντολών. Όταν υπάρχει μόνο ένα, δύο ή ένας μικρός αριθμός ορισμάτων γραμμής εντολών (ειδικά εάν η παρουσία ή η απουσία μιας σημαίας είναι το μόνο που απαιτείται και όχι μια συνοδευτική τιμή), γράψτε μερικές γραμμές κώδικα για να επεξεργαστείτε αυτές τις εντολές- οι επιλογές γραμμής δεν είναι μεγάλη υπόθεση. Όταν υπάρχουν περισσότερες επιλογές ή / και ορισμένες επιλογές έχουν τιμές, είναι ωραίο να έχετε πρόσβαση σε πιο εξελιγμένη υποστήριξη για ανάλυση της γραμμής εντολών.

Σε αυτήν την καταχώριση ιστολογίου, θα εξετάσω τη χρήση της βιβλιοθήκης Apache Commons CLI, αλλά υπάρχουν πολλές άλλες επιλογές όπως args4j, ανάλυση γραμμής εντολών TE-Code, CLAJR (Arguments γραμμής εντολών με αντανάκλαση Java), JArgs, JSAP (Java Simple Επεξεργαστής επιχειρημάτων), και πολλοί άλλοι (ακόμη περισσότερο εδώ).

Παρόλο που η βιβλιοθήκη Apache Commons CLI είναι μέρος του Apache Commons, είναι μια ξεχωριστή λήψη (JAR) από τη λήψη JAR για το Apache Commons Modeler και από τη λήψη JAR για το Apache Commons Lang για το οποίο μίλησα σε προηγούμενες καταχωρήσεις ιστολογίου διαθέσιμες εδώ και εδώ. Για αυτήν την καταχώριση ιστολογίου, χρησιμοποιώ το CLI 1.1 επειδή δεν υπάρχει αναμενόμενη κυκλοφορία για το CLI 2.0 (περισσότερες λεπτομέρειες σχετικά με αυτό στο τέλος αυτής της καταχώρησης).

Θα δείξω μερικά πολύ απλά παραδείγματα του Apache Common CLI και θα συμπεριλάβω κάποιους συνδέσμους προς άλλους πόρους κατά τη χρήση αυτής της βιβλιοθήκης.

Δύο σημαντικές τάξεις που χρησιμοποιούν το Apache Common CLI είναι η κατηγορία org.apache.commons.cli.Option και η στενά συνδεδεμένη org.apache.commons.cli.Options (περιέχει πολλές παρουσίες του Επιλογή τάξη). Αυτές οι τάξεις χρησιμοποιούνται για να αντιπροσωπεύουν τις αναμενόμενες επιλογές γραμμής εντολών. Τα ακόλουθα δύο αποσπάσματα κώδικα δείχνουν τη ρύθμιση μιας κλάσης Επιλογών για επιλογές στυλ Posix και επιλογές στυλ GNU.

Χρήση της κατηγορίας επιλογών με πολλαπλές εμφανίσεις επιλογών

 / ** * Κατασκευάστε και παρέχετε συμβατές με Posix επιλογές. * * Οι επιλογές @return αναμένονται από τη γραμμή εντολών της φόρμας Posix. * / public static Options buildPosixOptions () {final Options posixOptions = νέες επιλογές (); posixOptions.addOption ("display", false, "Εμφάνιση της κατάστασης."); επιστροφή posixOptions; } / ** * Κατασκευάστε και παρέχετε επιλογές συμβατές με GNU. * * Οι επιλογές @return αναμένονται από τη γραμμή εντολών της φόρμας GNU. * / public static Options buildGnuOptions () {final Options gnuOptions = νέες επιλογές (); gnuOptions.addOption ("p", "print", false, "Option for printing") .addOption ("g", "gui", false, "HMI option") .addOption ("n", true, "Number of αντίγραφα "); επιστροφή gnuOptions; } 

Σημειώστε στα παραδείγματα ρύθμισης Επιλογών ότι δεν υπάρχει ακόμη διαφορά στο χειρισμό επιλογών τύπου Posix έναντι στυλ GNU. Μέχρι στιγμής, οι επιλογές μπορούν να αντιμετωπίζονται με τον ίδιο τρόπο.

Πριν προχωρήσετε στην επίδειξη της ανάλυσης των ορίων της γραμμής εντολών του CLI με βάση αυτές τις αναμενόμενες επιλογές, αξίζει να σημειωθεί η υποστήριξη του CLI για πληροφορίες χρήσης και πληροφορίες βοήθειας μέσω της τάξης org.apache.commons.cli.HelpFormatter Αυτή η χρήσιμη κλάση βοηθητικών προγραμμάτων περιέχει μεθόδους όπως υπερφορτωμένες εκδόσεις του PrintHelp, υπερφορτωμένες εκδόσεις του PrintUsage και πολλές άλλες εξόδους και σχετικές μεθόδους.

Το ακόλουθο απόσπασμα κώδικα δείχνει μια μέθοδο που χρησιμοποιεί μία από τις μεθόδους printUsage του HelpFormatter και μία από τις μεθόδους printHelp αυτής της κλάσης.

printUsage () και printHelp ()

 / ** * Εκτυπώστε πληροφορίες χρήσης στο παρεχόμενο OutputStream. * * @param applicationName Όνομα της εφαρμογής για λίστα στη χρήση. * Επιλογές @param Επιλογές γραμμής εντολών για να είναι μέρος της χρήσης. * @param out OutputStream για να γράψετε τις πληροφορίες χρήσης. * / public static void printUsage (final String applicationName, final options Options, final OutputStream out) {final PrintWriter writer = νέο PrintWriter (έξω); τελικό HelpFormatter useFormatter = νέο HelpFormatter (); useFormatter.printUsage (συγγραφέας, 80, όνομα εφαρμογής, επιλογές); author.close (); } / ** * Γράψτε "βοήθεια" στο παρεχόμενο OutputStream. * / public static void printHelp (τελικές επιλογές Επιλογές, τελικό int έντυποRowWidth, τελική κεφαλίδα συμβολοσειράς, τελικό υποσέλιδο συμβολοσειράς, τελικό int διάστημαBeforeOption, final int spacesBeforeOptionDescription, final boolean displayUsage, final OutputStream out) {final String commandLineSyntax = "java -cp ApacheCommons δοχείο"; τελικό PrintWriter writer = νέο PrintWriter (έξω); τελικό HelpFormatter helpFormatter = νέο HelpFormatter (); helpFormatter.printHelp (συγγραφέας, printRowWidth, commandLineSyntax, κεφαλίδα, επιλογές, spaceBeforeOption, spacesBeforeOptionDescription, υποσέλιδο, displayUsage); author.close (); } 

Το επόμενο απόσπασμα κώδικα εμφανίζει ορισμένες κλήσεις στις μεθόδους printHelp () και printUsage () που εμφανίζονται παραπάνω και ακολουθείται από ένα στιγμιότυπο οθόνης που δείχνει την έξοδο από την εκτέλεση αυτών.

 System.out.println ("- ΧΡΗΣΗ -"); printUsage (applicationName + "(Posix)", buildPosixOptions (), System.out); displayBlankLines (1, System.out); printUsage (applicationName + "(Gnu)", buildGnuOptions (), System.out); displayBlankLines (4, System.out); System.out.println ("- ΒΟΗΘΕΙΑ -"); printHelp (buildPosixOptions (), 80, "POSIX HELP", "End of POSIX Help", 3, 5, true, System.out); displayBlankLines (1, System.out); printHelp (buildGnuOptions (), 80, "GNU HELP", "End of GNU Help", 5, 3, true, System.out); 

Το πρώτο στιγμιότυπο οθόνης δείχνει τα αποτελέσματα όταν ο παραπάνω κώδικας εκτελείται ακριβώς όπως φαίνεται (με αληθής μεταβιβάστηκε και στις δύο χρήσεις του εκτύπωση Βοήθεια μέθοδος για να δείξει ότι οι επιλογές πρέπει να περιλαμβάνονται στο τμήμα χρήσης). Το στιγμιότυπο της δεύτερης οθόνης δείχνει τι συμβαίνει όταν γίνεται η δεύτερη κλήση εκτύπωση Βοήθεια έχει περάσει ψευδώς σε αυτό, ώστε να μην εμφανίζονται οι επιλογές.

printUsage και printHelp

printUsage και printHelp with One printHelp Not Displaying Options

Ενώ οι πληροφορίες χρήσης και βοήθειας σχετικά με τις επιλογές είναι, όπως υποδηλώνουν τα ονόματά τους, χρήσιμες και χρήσιμες, ο πραγματικός λόγος για τη χρήση ορισμάτων γραμμής εντολών είναι συνήθως ο έλεγχος της συμπεριφοράς της εφαρμογής. Η επόμενη λίστα κωδικών εμφανίζει δύο μεθόδους ανάλυσης ορισμών γραμμής εντολών τύπου GNU και στυλ Posix. Ενώ η ρύθμιση των Επιλογών δεν ενδιαφερόταν για το συγκεκριμένο στυλ εκτός από τον καθορισμό των ίδιων των επιλογών, ο τύπος επιλογής είναι σημαντικός τώρα για τον προσδιορισμό του κατάλληλου αναλυτή που θα χρησιμοποιηθεί.

usePosixParser () και useGnuParser ()

 / ** * Εφαρμόστε το Apache Commons CLI PosixParser σε ορίσματα γραμμής εντολών. * * @param commandLineArguments Ορίσματα γραμμής εντολών για επεξεργασία με * Αναλυτή στυλ Posix. * / public static void usePosixParser (final String [] commandLineArguments) {final CommandLineParser cmdLinePosixParser = νέο PosixParser (); τελικές Επιλογές posixOptions = buildPosixOptions (); CommandLine commandLine; δοκιμάστε το {commandLine = cmdLinePosixParser.parse (posixOptions, commandLineArguments); if (commandLine.hasOption ("display")) {System.out.println ("Θέλετε μια οθόνη!"); }} catch (ParseException parseException) // επιλεγμένη εξαίρεση {System.err.println ("Αντιμετωπίστηκε εξαίρεση κατά την ανάλυση χρησιμοποιώντας PosixParser: \ n" + parseException.getMessage ()); }} / ** * Εφαρμόστε το Apache Commons CLI GnuParser σε ορίσματα γραμμής εντολών. * * @param commandLineArguments Ορίσματα γραμμής εντολών για επεξεργασία με * Αναλυτή τύπου Gnu. * / public static void useGnuParser (final String [] commandLineArguments) {final CommandLineParser cmdLineGnuParser = νέο GnuParser (); τελικές Επιλογές gnuOptions = buildGnuOptions (); CommandLine commandLine; δοκιμάστε το {commandLine = cmdLineGnuParser.parse (gnuOptions, commandLineArguments); if (commandLine.hasOption ("p")) {System.out.println ("Θέλετε να εκτυπώσετε (p επιλεγμένο)!"); } if (commandLine.hasOption ("print")) {System.out.println ("Θέλετε να εκτυπώσετε (η εκτύπωση επιλέχθηκε)!"); } if (commandLine.hasOption ('g')) {System.out.println ("Θέλετε ένα GUI!"); } if (commandLine.hasOption ("n")) {System.out.println ("Επιλέξατε τον αριθμό" + commandLine.getOptionValue ("n")); }} catch (ParseException parseException) // επιλεγμένη εξαίρεση {System.err.println ("Αντιμετωπίστηκε εξαίρεση κατά την ανάλυση χρησιμοποιώντας το GnuParser: \ n" + parseException.getMessage ()); }} 

Όταν εκτελείται ο παραπάνω κωδικός, η έξοδος του μοιάζει με εκείνη που εμφανίζεται στα επόμενα δύο στιγμιότυπα οθόνης:

Αποτελέσματα PosixParser

Αποτελέσματα ανάλυσης GNU

Το πλήρες παράδειγμα

Ο πλήρης κώδικας για την εφαρμογή του παραδείγματος από την οποία εμφανίζονται τμήματα παραπάνω παρατίθεται τώρα για ευκολία.