parsing命令行参数的Java库?
我用Java编写了一个命令行应用程序。 这个应用程序应该使用参数和命令的组合,类似于svn
。
例子
app url command1 app url command2 --parameter2 -x app url command1 --param-with-argument argument app --parameter url command1 app --no-url command2 app --help
通缉
- 存在一个易于使用的Java库
- 支持这些命令行的parsing
- (奖金)自动创build适当的帮助
我是Commons CLI的粉丝。
您可以将其设置为了解命令,标记(使用短名称和长名称),是否需要某些命令/开关,或者是否具有默认值。 它甚至具有打印出有用的帮助types消息的function。
使用scheme页面有一些如何使用它的很好的例子。
尝试args4j
: http : args4j
我更喜欢args4j
到Commons CLI。 (我也用过)
用args4j
,你不需要调用任何函数。 一切都为你而做! (通过reflection将参数设置为对象字段。)
这是一个相对最新的(截至2017年8月)回答你的问题的图书馆列表。
- JArgs
- Jakarta Commons CLI
- TE-Code (它有一个命令行parsing库)
- argparser
- GNU getopt的Java端口
- Args4J
- 司法制度评估scheme
- JOpt简单
- CLAJR
- CmdLn
- JewelCli
- JCommando
- parsing-CMD
- JCommander
- picocli (2017)使用ANSI颜色和自动完成的帮助
如果您正在寻找build议,我build议JOpt简单或JewelCli。
JewelCLI是一个用于命令行parsing的Java库,可以生成干净的代码 。 它使用configuration了注解的代理接口为您的命令行参数dynamic构buildtypes安全的API。
示例参数接口Person.java
:
import uk.co.flamingpenguin.jewel.cli.Option; public interface Person { @Option String getName(); @Option int getTimes(); }
参数接口Hello.java
一个示例用法:
import static uk.co.flamingpenguin.jewel.cli.CliFactory.parseArguments; import uk.co.flamingpenguin.jewel.cli.ArgumentValidationException; public class Hello { public static void main(String [] args) { try { Person person = parseArguments(Person.class, args); for (int i = 0; i < person.getTimes(); i++) System.out.println("Hello " + person.getName()); } catch(ArgumentValidationException e) { System.err.println(e.getMessage()); } } }
将上述文件的副本保存到一个目录中,并将JewelCLI 0.7.6 JAR下载到该目录中。
编译并运行在Linux / Mac OS X / Bash上的例子:
javac -cp jewelcli-0.7.6.jar:. Person.java Hello.java java -cp jewelcli-0.7.6.jar:. Hello --name="John Doe" --times=3
编译并运行Windows命令提示符下的示例:
javac -cp jewelcli-0.7.6.jar;. Person.java Hello.java java -cp jewelcli-0.7.6.jar;. Hello --name="John Doe" --times=3
运行该示例应该会产生以下输出:
Hello John Doe Hello John Doe Hello John Doe
为了完整起见,我们添加JCommander https://github.com/cbeust/jcommander
public class JCommanderTest { @Parameter public List<String> parameters = Lists.newArrayList(); @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity") public Integer verbose = 1; @Parameter(names = "-groups", description = "Comma-separated list of group names to be run") public String groups; @Parameter(names = "-debug", description = "Debug mode") public boolean debug = false; }
和一个示例用法
CommanderTest jct = new JCommanderTest(); String[] argv = { "-log", "2", "-groups", "unit", "a", "b", "c" }; new JCommander(jct, argv); Assert.assertEquals(jct.verbose.intValue(), 2);
这也是值得一看的- 简单 。
它试图遵守POSIX getopt()和GNU getopt_long()的命令行选项语法。 它似乎有一些社区的牵引力,尤其是OpenJDK (和Minecraft!)的命令行parsinglib的select。
命令行是基于注释的,允许将参数(序列,嵌套,参数,types等)组合起来的复杂规则,并有相当的文档logging。
要使用它,添加
<dependency> <groupId>com.github.jankroken</groupId> <artifactId>commandline</artifactId> <version>1.7.0</version> </dependency>
你的pom,并宣布可用的选项如下:
public class CommandOptions { private List<String> commands = null; private boolean parameter = false; private boolean url = true; private boolean help = false; @LooseArguments public void setCommands(List<String> commands) { this.commands = commands; } @LongSwitch("parameter") @Toggle(true) public void setParameter(boolean parameter) { this.parameter=parameter; } @LongSwitch("noURL") @Toggle(false) public void setUrl(boolean url) { this.url = url; } @longSwitch("help") @Toggle(true) public void setHelp(boolean help) { this.help = help; } // getters }
然后才能真正parsing命令行呢
public final static void main(String[] args) { try { CommandOptions options = CommandLineParser.parse(CommandOptions.class, args, OptionStyle.SIMPLE); // and then you can pass options to your application logic... } catch ... } }
请注意,它尚未包含自动生成的帮助文本。 这是原型,但中止。 对于简单的情况,生成一个基本的帮助文本是很容易的,但是对于更复杂的configuration(比如“find”或“gcc”等应用程序的可用选项),结果将不会很好,而且您可能更希望自己控制布局。
JSAP看起来相当不错。
我正在使用空运进行一个我正在进行的项目,似乎工作得非常好:
https://github.com/airlift/airline
简单的Maven依赖关系,你需要添加:
<dependency> <groupId>io.airlift</groupId> <artifactId>airline</artifactId> <version>0.6</version> </dependency>
在此之后,它是基于注释,并有一个很好的显示帮助文本的方式。
如果有帮助,可以在这里看到一个例子:
还有一个java getopt http://www.urbanophile.com/arenn/hacking/download.html