2016-03-22 6 views
0
public static void main(String[] args) { 

    Options options = new Options(); 
    Option hostOption = Option.builder("h") 
      .longOpt("host") 
      .required(false) 
      .build(); 

    Option portOption = Option.builder("p") 
      .longOpt("port") 
      .required(false) 
      .type(Number.class) 
      .build(); 

    Option serviceNameOption = Option.builder("n") 
      .longOpt("service_name") 
      .required(false) 
      .build(); 

    options.addOption(hostOption); 
    options.addOption(portOption); 
    options.addOption(serviceNameOption); 

    String serviceName = "dbservice" 
    String host = "localhost"; 
    int port = 7512; 
    CommandLineParser parser = new DefaultParser(); 
    Server server = new Server(); 
    try { 
     CommandLine cmd = parser.parse(options, args); 
     if(cmd.hasOption("host")) { 
      host = cmd.getOptionValue("host"); 
      System.out.println(host); //gets in here but prints null 
     } 
     if (cmd.hasOption("port")) { 
      port = ((Number)cmd.getParsedOptionValue("port")).intValue(); 
      System.out.println(port); // gets in here but throws a null pointer exception 

     } 
     if (cmd.hasOption("service_name")) { 
      serviceName = cmd.getOptionValue("service_name"); 
      System.out.println(serviceName); // gets in here but prints null 
     } 
    } catch(Exception e) {} 
} 

Ich benutze Apache Commons CLI-Bibliothek zum Parsen von Befehlszeilenargumente, aber es scheint nicht wie erwartet zu parsen. Nicht sicher, was ich hier vermisse?Apache commons CLI analysiert nicht wie erwartet?

Ich habe auf viele verschiedene Arten aufgerufen, nur um zu sehen, ob es funktioniert und der folgende ist einer von ihnen java -jar dbservice.jar --host localhost --port 7514. Was ist der richtige Weg? Ich sehe das nicht in der Dokumentation

+0

Ich glaube, wenn Sie eine Option (wie localhost oder Port-Nummer) nehmen, müssen Sie dem Gulden angeben, dass es ein Argument braucht. Versuchen Sie, dem Builder vor dem Build() .hasArg (true) hinzuzufügen. – KevinO

Antwort

1

Damit die Option ein Argument akzeptiert, muss das hasArg (true) an den Builder übergeben werden. Fügen Sie für jede der Optionen ein ".hasArg (true)" hinzu. Das Ändern des Codes mit diesem Argument und das Ausführen eines Testfalls führten zur erwarteten Ausgabe.

Option hostOption = Option.builder("h") 
     .longOpt("host") 
     .required(false) 
     .hasArg(true) 
     .build(); 
+0

Es hat für Sie funktioniert? Wie haben Sie die Befehlszeilenargumente übergeben? – user1870400

+0

Ich habe die Argumente mit der langen Form übergeben: '--host localhost --port 1234', nachdem ich den Code geändert habe. – KevinO

0

Zum ersten Mal Benutzer, hasArg() ist verwirrend, würden Sie standardmäßig annehmen, dass hasArg ohne Angabe(), mindestens ein Argument eine Option zu schaffen genommen wird. Das Übergeben eines Wertes '--opt val' ohne hasArg() ignoriert das Val stillschweigend, als ob nichts übergeben würde. Nun, wenn no hasArg() angegeben wurde, sollte es fehlschlagen, weil etwas übergeben wurde anstatt zu ignorieren. Vielleicht sollte es einen strengen Modus geben?