2017-06-19 52 views
1

我试图用jCommander来解析Groovy中的命令行参数。使用jCommander从Groovy解析命令行(示例代码失败)

(的MacBook(酋长),Groovy的2.4.11,jCommander-1.49)

提供jCommander.org(见http://jcommander.org/#_groovy)的例子如下:

import com.beust.jcommander.Parameter; 

public class Args { 
    @Parameter 
    private List<String> parameters = new ArrayList<>(); 

    @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity") 
    private Integer verbose = 1; 

    @Parameter(names = "-groups", description = "Comma-separated list of group names to be run") 
    private String groups; 

    @Parameter(names = "-debug", description = "Debug mode") 
    private boolean debug = false; 
} 

但是当我尝试运行该代码(常规jCommanderSample.groovy)我得到:

[email protected]:~/.../Groovy/CliParameters $ groovy jCommanderSample.groovy 
Caught: groovy.lang.MissingMethodException: No signature of method: static com.beust.jcommander.JCommander.newBuilder() is applicable for argument types:() values: [] 
groovy.lang.MissingMethodException: No signature of method: static com.beust.jcommander.JCommander.newBuilder() is applicable for argument types:() values: [] 
    at jCommanderSample$_run_closure1.doCall(jCommanderSample.groovy:9) 
    at jCommanderSample.run(jCommanderSample.groovy:8) 

我错过了什么?

+0

lexu,你有机会尝试解决方案吗? – Rao

+0

thx饶。您的解决方案帮助我了解发生了什么问题..提供的代码不能单独运行,它仍然需要调用者。我将添加一个简单的工作脚本,可以从命令行运行并演示参数处理。 – lexu

+0

没有从你的回应中得到它。问题中发布的原始问题是否已解决? – Rao

回答

0

下面是我复制到我的片段收集解决方案:

样品Groovy脚本为jCommander

#!/usr/bin/env groovy 
import com.beust.jcommander.* 
class Simple { 
    static class Args { 
    @Parameter 
    private List<String> aParamList = []; 
    @Parameter(names = [ "--quiet", "-q" ], description = "quiet mode, no output to STDOUT") 
    private Boolean aQuiet = false; 

    @Parameter(names = [ "--logging", "-l" ], description = "logging verbosity (0-4)") 
    private Integer aLogLevel = 1; 

    @Parameter(names = [ "--group", "-g" ], description = "group name, default is 'none'") 
    private String aGroupName = 'none'; 
    } 

    public static main(String[] pArgs) { 
    Boolean vQuiet ; 
    Integer vLogLevel ; 
    String vGroupName ; 
    List<String> vParamList; 
    new Args().with { 
     try { 
     new JCommander(it, pArgs) 
     vQuiet  = it.aQuiet; 
     vLogLevel = it.aLogLevel; 
     vGroupName = it.aGroupName; 
     vParamList = it.aParamList; 
     } 
     catch(com.beust.jcommander.ParameterException e) { 
     println "Fatal Error parsing arguments: $e.message" 
     System.exit(-1) 
     } 
    } 
    println "unbound parameters: " + vParamList; 
    println "   LogLevel: $vLogLevel"; 
    println "  Silent Mode: $vQuiet"; 
    println "   GroupName: $vGroupName"; 
    } 
} 
1

您可能注意到groovy中的列表定义有所不同。 在java中,使用了{ ..}。在常规如下:

def list = [1, 2] 

变化来自:

@Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity") 

要:

@Parameter(names = ["-log", "-verbose" ] , description = "Level of verbosity") 
+0

+1现在代码编译(几乎),但编译器现在抱怨缺少的主要方法..请参阅我自己的答案为jCommander的工作'演示'版本 – lexu