getOpt

takidoso

Erfahrenes Mitglied
Hallo und Halli,
ich habe bezöglich Java und getOpt mal gegoogelt, fand 'ne Menge Links offenbar zu verschiedensten Umsetzungen. Irgendwie gibt es zwar auch eine GNU Umsetzung, aber eine Download-Seite habe ich noch nicht so richtig wahrnehmen können.

Verwendet irgendjemand hier getOpt, und wenn ja, mit welcher Implementation wurden welche Erfahungen gemacht?
Am liebsten dann noch die Webseite, auf der man sich die Umsetung bezüglich der geschilderten Erfahrung direkt runtreladen und anschauen kann.

Falls es so eine Umfrage schon geben sollte, wäre natürlich auch glücklich einen Link dazu zu bekommen.


vielen Dank im Voraus an alle die sich beteiligen mögen


Takidoso
 
Hallo,

was möchtest du denn genau tun? Willst du Commandozeilen Argumente Parsen / Analyisieren oder möchtest du an ein Programm / Shell-Script, welches mittels getOpt Parameter einliest ansteuern?

Zum parsen von Kommandozeilen-Argumenten gibt es ein paar gute Bibliotheken z.Bsp.:
JCommander, http://jcommander.org/
Apache CLI, http://commons.apache.org/cli/
Parse-CMD: http://code.google.com/p/parse-cmd/
CLI-Parser: http://code.google.com/p/cli-parser/
JOpt: http://pholser.github.com/jopt-simple/

usw....

... wie du siehst hat man da wohl ziemlich oft das Rad neu erfunden :)

Gruß Tom
 
Hallo,

Code Golf

hier eine DIY Variante eines kleinen Argument Parsers ohne externe Abhängigkeiten:
(Braucht Java 7 wegen Named Regex Group (Matcher.group(name)))
Java:
package de.tutorials;

import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CommandLineOptionParsingExample {
   
   public static void main(String[] args) {
      Options opts = new Options();
      opts.parse(new String[] { "-hostname=localhost", "-mode=client", "-port=4711", "-watchLocation=d:/temp/tutorials/", "-uploadPath=upload", "-debug", "-verbose=false"});
      System.out.println(opts);
   }

   //Beispiel  Optionensammlung
   static class Options extends AbstractOptions {
      
      {
	 exitOnError = true;
      }
      
      enum Mode{
	 client, server;
      }
      
      public Mode mode;
      public String hostname;
      public int port;
      public String watchLocation;
      public String uploadPath;
      boolean debug;
      boolean verbose;
   }

   static abstract class AbstractOptions {
      
      protected boolean exitOnError;

      public void parse(String[] args) {
	 for (Field field : getClass().getDeclaredFields()) {
	    for (String arg : args) {
	       tryParseArg(field, arg);
	    }
	 }
      }

      private void tryParseArg(Field field, String arg) {
	 String optionRegex = "-" + field.getName() + "(=(?<" + field.getName() + ">[^\\s]+))?";
	 Matcher matcher = Pattern.compile(optionRegex).matcher(arg);
	 if (matcher.matches()) {
	    String valueStr = null;
	    try {
	       valueStr = matcher.group(field.getName());
	       Object value = convertToRequiredFieldType(valueStr, field);
	       field.set(this, value);
	    } catch (Exception e) {
	       System.err.printf("Could not parse option -%s value:%s %n",field.getName(), valueStr);
	       if(exitOnError){
		  System.exit(-1);
	       }
	    }
	 }
      }

      
      @SuppressWarnings({ "unchecked", "rawtypes" }) //for Enum.valueOf(...)
      protected Object convertToRequiredFieldType(String valueStr, Field field) throws Exception {
	 if (String.class.equals(field.getType())) {
	    return valueStr;
	 } else if (field.getType().isPrimitive()) {
	    Object defaultValue = field.get(this);
	    if(valueStr == null && Boolean.TYPE.equals(field.getType())){
	       return true;
	    }
	    return defaultValue.getClass().getDeclaredMethod("valueOf", String.class).invoke(null, valueStr);
	 } else if(field.getType().isEnum()) {
	   return Enum.valueOf((Class<Enum>)field.getType(), valueStr);
	 } else {
	    throw new IllegalArgumentException("Conversion of " + field + " is not supported");
	 }
      }

      @Override
      public String toString() {
	 StringBuilder s = new StringBuilder(64);

	 s.append("Options{ ");
	 try {
	    Field[] fields = getClass().getDeclaredFields();
	    for (int i = 0; i < fields.length; i++) {
	       s.append(fields[i].getName()).append(":").append("" + fields[i].get(this));
	       if (i < fields.length - 1) {
		  s.append(", ");
	       }
	    }
	 } catch (IllegalArgumentException | IllegalAccessException e) {
	    e.printStackTrace();
	 }
	 s.append("}");

	 return s.toString();
      }
   }
}

Ausgabe:
Code:
Options{ mode:client, hostname:localhost, port:4711, watchLocation:d:/temp/tutorials/, uploadPath:upload, debug:true, verbose:false}

//Edit: Irgendwie bekommt der Syntax-Highlighter die Codeformatierung nicht mehr richtig hin...

Gruß Tom
 
Zurück