2017-09-05 2 views
1

J'essaie d'analyser mes arguments de ligne de commande à l'aide de la CLI apache commons. Cela peut être un peu lourd pour l'exemple ici, mais c'est logique dans le contexte du programme que je suis en train de créer. J'essaye de lire un filtre de modèle de fichier, semblable à ce que grep utilise pour sélectionner les fichiers à traiter.Comment analyser les modèles de fichiers à l'aide des communs Apache CLI

Mon argument ressemble à ceci:

Program --input *.* 

J'ai écrit un programme de test pour voir ce que l'analyseur voit;

public static void main(String[] args) { 

    Options options = new Options(); 
    options.addOption(new Option(INPUT_FILTER_SHORT, INPUT_FILTER_LONG, true, INPUT_FILTER_DESCRIPTION)); 

    CommandLineParser parser = new BasicParser(); 
    CommandLine cmd = parser.parse(options, args); 

    System.out.println(cmd.getOptionValue(INPUT_FILTER_SHORT)); 
} 

Ceci affiche:

.classpath 

Si je change mes arguments:

Program --input test.txt 

Je reçois la sortie:

test.txt 

Je suppose que je avoir à faire quelque chose pour dire aux communs apache ce que * est pas un personnage spécial? Je n'arrive pas à trouver quoi que ce soit à ce sujet en ligne. Je rencontre ça sur Windows (7). Je suis à peu près certain que c'est le *. * Qui cause le problème car lorsque je permets d'utiliser des motifs qui n'utilisent pas *, le motif attendu apparaît.

+0

Qu'est-ce qui se passe si vous entourez '*. *' par des guillemets (essayez des guillemets simples et doubles)? Exemple: 'Program --input" *. * "' – Rafa

+0

Je viens de mettre à jour le post, mais cela se produit sur Windows 7. Lorsque je l'entoure de guillemets simples, il affiche '*. *' (Y compris les guillemets), quand je double citation, il affiche '.classpath' – Andy

Répondre

1

Votre problème n'est pas vraiment lié à Commons CLI, mais plutôt à la façon dont le shell et l'exécutable Java traitent ensemble les paramètres.

Pour éliminer d'autres facteurs, et voir ce qui se passe, utilisez un programme court Java:

public class ArgsDemo { 
    public static void main(String[] args) { 
     for(int i=0; i<args.length; i++) { 
       System.out.println("" + i + ": " + args[i]); 
     } 
    } 
} 

Jouez avec java ArgsDemo hello world, etc. java ArgsDemo * et observez ce qui se passe.

Sous UNIX et Linux:

Java ne pas de traitement spécial de *. Cependant, la coque fait. Donc, si vous avez fait:

$ mkdir x 
$ cd x 
$ touch a b 
$ java -jar myjar.jar MyClass * 

... alors MyClass.main() serait appelé avec l'ensemble des paramètres ["a","b"] - car le shell UNIX étend * aux fichiers dans le répertoire courant.

Vous pouvez supprimer cela en fuite:

$ java -jar myjar MyClass * // main() sees ["*"]) 

(Notez qu'un shell UNIX ne s'étendrait *.*-.classpath parce que cette forme ne tiendrait pas compte des fichiers « cachés » en commençant par .)

Sous Windows

cmd.exe ne fait pas de caractère générique UNIX ansion.Si vous fournissez * en tant que paramètre à une commande dans Windows, la commande obtient un littéral *. Ainsi, par exemple, PKUNZIP *.zip passe *.zip à PKUNZIP.EXE, et c'est à ce programme d'étendre le caractère générique s'il le souhaite.

Depuis une version de Java 7, l'exécutable Java pour Windows effectue ses propres extensions de caractères génériques, avant en passant les paramètres à votre classe main().

Je n'ai pas été en mesure de trouver une documentation claire des règles d'extension génériques de Java pour Windows, mais vous devriez être en mesure de le contrôler avec les guillemets, les guillemets pour échapper à empêcher cmd.exe les interpréter:

> java.exe -jar myjar.jar MyClass """*.*""" 

(non testé Je n'ai pas de machine Windows à portée de main, et en citant cmd.exe est un peu une bête - ne soit s'il vous plaît expérimenter et modifier ci-dessus ou laisser un commentaire)

+0

Je n'ai pas de système Windows à tester malheureusement (ou heureusement: D) ​​- mais je pense qu'il est plausible que par les règles de Windows '*. *' correspond ''. classpath'. – slim

+0

Voir https://stackoverflow.com/questions/562038/escaping-double-quotes-in-batch-script pour plus de détails concernant les guillemets d'échappement dans Windows. – slim