最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JCommander解析命令行參數(shù)使用詳解

 更新時(shí)間:2023年09月08日 11:25:34   作者:wdbyte  
這篇文章主要為大家介紹了JCommander解析命令行參數(shù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

如果你想構(gòu)建一個(gè)支持命令行參數(shù)的程序,那么 jcommander 非常適合你,jcommander 是一個(gè)只有幾十 kb 的 Java 命令行參數(shù)解析工具,可以通過注解的方式快速實(shí)現(xiàn)命令行參數(shù)解析。

這篇教程會(huì)通過介紹 jcommadner ,快速的創(chuàng)建一個(gè)命令行程序,最后支持的命令參數(shù)功能如下圖。

這個(gè)命令行工具仿照 git 操作命令,主要提供了如下功能命令:

  • git-app.jar -help 查看命令幫助信息。
  • git-app.jar -version 查看當(dāng)前版本號(hào)。
  • git-app.jar clone http://xxxx 通過 URL 克隆一個(gè)倉庫。
  • git-app.jar add file1 file2 暫存 file1 文件 file2 文件。
  • git-app.jar commit -m "注釋" 提交并添加注釋。

jcommander 引入

截止文章編寫時(shí)間,最新版本如下:

<!-- https://mvnrepository.com/artifact/com.beust/jcommander -->
<dependency>
    <groupId>com.beust</groupId>
    <artifactId>jcommander</artifactId>
    <version>1.82</version>
</dependency>

jcommander 參數(shù)綁定

命令行解析中,參數(shù)解析與綁定是最實(shí)用的一個(gè)場景,jcommander 使用 Parameter 注解進(jìn)行參數(shù)綁定。我們定義一個(gè) GitCommandOptions.java 類來測試參數(shù)綁定。

package com.wdbyte.jcommander.v1;
import com.beust.jcommander.Parameter;
/**
 * @author https://www.wdbyte.com
 */
public class GitCommandOptions {
    @Parameter(names = {"clone"},
        description = "克隆遠(yuǎn)程倉庫數(shù)據(jù)")
    private String cloneUrl;
    public String getCloneUrl() {
        return cloneUrl;
    }
}

使用 jcommander 結(jié)合 GitCommandOptions 來解析參數(shù)。

package com.wdbyte.jcommander.v1;
import com.beust.jcommander.JCommander;
/**
 * @author https://www.wdbyte.com
 */
public class GitApp {
    public static void main(String[] args) {
		    // args = new String[]{"clone","http://www.wdbyte.com/test.git"};
        GitCommandOptions gitCommandOptions = new GitCommandOptions();
        JCommander commander = JCommander.newBuilder()
            .addObject(gitCommandOptions)
            .build();
        commander.parse(args);
        System.out.println("clone " + gitCommandOptions.getCloneUrl());
    }
}

打包后可以執(zhí)行命令參數(shù):

$ java -jar git-app.jar clone http://www.wdbyte.com/test.git
clone http://www.wdbyte.com/test.git

這里是一個(gè)字符串參數(shù),需要在命令中輸出參數(shù)值,對于 boolean 類型的參數(shù),不需要傳值,有命令即為 true 值。

參數(shù)名稱

@Parameter 注解中的 names 屬性可以定義參數(shù)的名稱。且可以指定多個(gè)參數(shù)名稱,讓我再添加 version 參數(shù)和 help 參數(shù),同時(shí)設(shè)置參數(shù)別名。這兩個(gè)參數(shù)是 boolean 類型。

@Parameter(names = {"help", "-help", "-h"},
    description = "查看幫助信息",
    help = true)
private boolean help;
@Parameter(names = {"version", "-version", "-v"},
    description = "顯示當(dāng)前版本號(hào)")
private boolean version = false;

參數(shù)限制

clone 參數(shù)可以接受一個(gè)要克隆的 URL 鏈接,但是正常情況下只需要一個(gè) URL 鏈接??梢酝ㄟ^ arity = 1 進(jìn)行限制。

@Parameter(names = {"clone"},
    description = "克隆遠(yuǎn)程倉庫數(shù)據(jù)",
    arity = 1)
private String cloneUrl;

幫助信息

使用 usage() 參數(shù)可以打印命令幫助信息。

GitCommandOptions gitCommandOptions = new GitCommandOptions();
JCommander commander = JCommander.newBuilder()
    .addObject(gitCommandOptions)
    .build();
commander.parse(args);
// 打印幫助信息
commander.usage();

運(yùn)行輸出幫助信息:

$ java -jar git-app.jar
Usage: <main class> [options]
  Options:
    clone
      克隆遠(yuǎn)程倉庫數(shù)據(jù)
    help, -help, -h
      查看幫助信息
    version, -version, -v
      顯示當(dāng)前版本號(hào)
      Default: false

雖然正確的輸出了幫助信息,但是其中有 main class 這段,是因?yàn)槲覀儧]有指定項(xiàng)目名稱,我們指定項(xiàng)目名稱為 git-app。

JCommander commander = JCommander.newBuilder()
            .programName("git-app")
            .addObject(gitCommandOptions)
            .build();

參數(shù)排序

在幫助信息中,如果想要自定義參數(shù)順序,可以通過 order = 來排序,數(shù)字越小越靠前。

@Parameter(names = {"version", "-version", "-v"},
    description = "顯示當(dāng)前版本號(hào)",
    order = 2)
private boolean version = false;

參數(shù)綁定完整測試

package com.wdbyte.jcommander.v2;
import com.beust.jcommander.Parameter;
/**
 * @author https://www.wdbyte.com
 */
public class GitCommandOptions {
    @Parameter(names = {"help", "-help", "-h"},
        description = "查看幫助信息",
        order = 1,
        help = true)
    private boolean help;
    @Parameter(names = {"clone"},
        description = "克隆遠(yuǎn)程倉庫數(shù)據(jù)",
        order = 3,
        arity = 1)
    private String cloneUrl;
    @Parameter(names = {"version", "-version", "-v"},
        description = "顯示當(dāng)前版本號(hào)",
        order = 2)
    private boolean version = false;
    //...get method
}

GitApp.java

package com.wdbyte.jcommander.v2;
import com.beust.jcommander.JCommander;
public class GitApp {
    public static void main(String[] args) {
        GitCommandOptions gitCommandOptions = new GitCommandOptions();
        JCommander commander = JCommander.newBuilder()
            .programName("git-app")
            .addObject(gitCommandOptions)
            .build();
        commander.parse(args);
        // 打印幫助信息
        if (gitCommandOptions.isHelp()) {
            commander.usage();
            return;
        }
        if (gitCommandOptions.isVersion()) {
            System.out.println("git version 2.24.3 (Apple Git-128)");
            return;
        }
        if (gitCommandOptions.getCloneUrl() != null) {
            System.out.println("clone " + gitCommandOptions.getCloneUrl());
        }
    }
}

運(yùn)行測試:

jcommander 參數(shù)驗(yàn)證

在上面的例子中, 假設(shè) clone 命令傳入的參數(shù)必須是一個(gè) URL,那么我們就要進(jìn)行參數(shù)驗(yàn)證,jcommander 也提供了特有的參數(shù)驗(yàn)證方式。

編寫參數(shù)驗(yàn)證類,需要實(shí)現(xiàn) IParameterValidator 接口。

package com.wdbyte.jcommander.v3;
import java.net.MalformedURLException;
import java.net.URL;
import com.beust.jcommander.IParameterValidator;
import com.beust.jcommander.ParameterException;
/**
 * @author https://www.wdbyte.com
 */
public class UrlParameterValidator implements IParameterValidator {
    @Override
    public void validate(String key, String value) throws ParameterException {
        try {
            new URL(value);
        } catch (MalformedURLException e) {
            throw new ParameterException("參數(shù) " + key + " 的值必須是 URL 格式");
        }
    }
}

clone 參數(shù)指定驗(yàn)證類。

@Parameter(names = {"clone"},
    description = "克隆遠(yuǎn)程倉庫數(shù)據(jù)",
    validateWith = UrlParameterValidator.class,
    order = 3,
    arity = 1)
private String cloneUrl;

運(yùn)行測試:

$ java -jar git-app.jar clone https://www.wdbyte.com/test.git
clone https://www.wdbyte.com/test.git
$ java -jar git-app.jar clone test.git
Exception in thread "main" com.beust.jcommander.ParameterException: 參數(shù) clone 的值必須是 URL 格式
	at com.wdbyte.jcommander.v3.UrlParameterValidator.validate(UrlParameterValidator.java:19)
	at com.beust.jcommander.ParameterDescription.validateParameter(ParameterDescription.java:377)
	at com.beust.jcommander.ParameterDescription.validateParameter(ParameterDescription.java:344)

jcommander 子命令

在使用 git 時(shí),我們經(jīng)常會(huì)使用下面兩個(gè)命令。

  • git add file1 file2 暫存 file1 文件 file2 文件。
  • git commit -m "注釋" 提交并添加注釋。

什么是子命令

這是一種很常見的操作,git commit 除了可以跟 -m 子參數(shù)外,還可以跟各種參數(shù),通過 git 幫助文檔可以看到。

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
           [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
           [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
           [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
           [--date=<date>] [--cleanup=<mode>] [--[no-]status]
           [-i | -o] [-S[<keyid>]] [--] [<file>...]

這種有子參數(shù)的情況,我們可以稱 commit 為 git 的一個(gè)子命令,使用 jcommander 如何配置子命令呢?

jcommander 子命令實(shí)現(xiàn)

我們新增子命令對應(yīng)的參數(shù)類 GitCommandCommit.java.

package com.wdbyte.jcommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
/**
 * git commit -m "desc"
 * @author https://www.wdbyte.com
 */
@Parameters(commandDescription = "提交文件", commandNames = "commit")
public class GitCommandCommit {
    public static final String COMMAND = "commit";
    @Parameter(names = {"-comment", "-m"},
        description = "請輸入注釋",
        arity = 1,
        required = true)
    private String comment;
    public String getComment() {
        return comment;
    }
}

代碼中使用 @Parameters 注解指定了子命令為 commit,同時(shí)使用 @Paramete 注解指定子參數(shù) -m,同時(shí) -m 參數(shù)是必須的,使用屬性 required = true 來指定。

使用 GitCommandCommit:

使用 addCommand 添加 Commit 命令參數(shù)類。

GitCommandOptions gitCommandOptions = new GitCommandOptions();
GitCommandCommit commandCommit = new GitCommandCommit();
JCommander commander = JCommander.newBuilder()
    .programName("git-app")
    .addObject(gitCommandOptions)
    .addCommand(commandCommit)
    .build();
commander.parse(args);
String parsedCommand = commander.getParsedCommand();
if ("commit".equals(parsedCommand)) {
    System.out.println(commandCommit.getComment());
}

運(yùn)行測試:

$ java -jar git-app.jar commit -m '注釋一下'
注釋一下

同上,我們可以添加 add 命令對應(yīng)的參數(shù)類:GitCommandAdd.java. 這次我們定義一個(gè) List 類型參數(shù),但是不在屬性上指定子參數(shù)名稱。

package com.wdbyte.jcommander.v5;
import java.util.List;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
/**
 * git add file1 file2
 *
 * @author https://www.wdbyte.com
 */
@Parameters(commandDescription = "暫存文件", commandNames = "add", separators = " ")
public class GitCommandAdd {
    public static final String COMMAND = "add";
    @Parameter(description = "暫存文件列表")
    private List<String> files;
    public List<String> getFiles() {
        return files;
    }
}

同樣添加到子命令:

JCommander commander = JCommander.newBuilder()
    .programName("git-app")
    .addObject(gitCommandOptions)
    .addCommand(commandCommit)
    .addCommand(commandAdd)
    .build();
commander.parse(args);
if ("add".equals(parsedCommand)) {
    for (String file : commandAdd.getFiles()) {
        System.out.println("暫存文件:" + file);
    }
}

運(yùn)行測試:

$ java -jar git-app.jar add file1.txt file2.txt
暫存文件:file1.txt
暫存文件:file2.txt

jcommander 參數(shù)轉(zhuǎn)換

在上面的 GitCommandAdd 代碼中,add 命令傳入的都是文件路徑,現(xiàn)在是使用 List<String> 來接收入?yún)ⅲǔG闆r想我們可能需要直接轉(zhuǎn)換成方便操作的類型,如 File 或者 Path,這該如何方面的轉(zhuǎn)換呢,jcommander 也提供了方便轉(zhuǎn)換類。

首先編寫一個(gè)轉(zhuǎn)換類 FilePathConverter 用于把入?yún)⑥D(zhuǎn)換成 Path 類,同時(shí)校驗(yàn)文件是否存在

package com.wdbyte.jcommander;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import com.beust.jcommander.IStringConverter;
import com.beust.jcommander.ParameterException;
/**
 *
 * @author https://www.wdbyte.com
 */
public class FilePathConverter implements IStringConverter<Path> {
    @Override
    public Path convert(String filePath) {
        Path path = Paths.get(filePath);
        if (Files.exists(path)) {
            return path;
        }
        throw new ParameterException(String.format("文件不存在,path:%s", filePath));
    }
}

通過注解指定轉(zhuǎn)換類:

@Parameter(description = "暫存文件列表", converter = FilePathConverter.class)
private List<Path> files;

打包測試:

$ java -jar git-app.jar add file1 file2
文件不存在,path:file1

$ ls -l
total 12448
drwxr-xr-x  2 darcy  staff    64B  6 15 21:10 archive-tmp
drwxr-xr-x  3 darcy  staff    96B  6 15 21:10 classes
drwxr-xr-x  3 darcy  staff    96B  6 15 21:10 generated-sources
-rw-r--r--  1 darcy  staff   5.6M  6 16 20:44 git-app.jar

$ git-app.jar git-app.jar
暫存文件:git-app.jar

總體測試

一如既往,文章代碼都存放在 Github.com/niumoo/javaNotes.

參考:https://jcommander.org/

相關(guān)文章

  • SpringBoot項(xiàng)目中Date類型數(shù)據(jù)在接口返回的時(shí)間不正確的問題解決

    SpringBoot項(xiàng)目中Date類型數(shù)據(jù)在接口返回的時(shí)間不正確的問題解決

    如果接口返回的Date類型時(shí)間與數(shù)據(jù)庫中datetime不一致,可能是由于沒有正確配置時(shí)區(qū)導(dǎo)致的,解決方法是在yaml配置文件中指定正確的日期格式和時(shí)區(qū)配置,修改配置并重啟項(xiàng)目后,可以獲得正確的時(shí)間,下面就來介紹一下
    2024-09-09
  • Java8的EnumMap源碼分析

    Java8的EnumMap源碼分析

    這篇文章主要介紹了Java8的EnumMap源碼分析,EnumMap 是一個(gè)用于存儲(chǔ) key 為枚舉類型的 map,底層使用數(shù)組實(shí)現(xiàn)(K,V 雙數(shù)組),與其他類型 map 不同的是 EnumMap 底層使用雙數(shù)組來存儲(chǔ) key 與 value,key 數(shù)組會(huì)在構(gòu)造函數(shù)中根據(jù) keyType 進(jìn)行初始化,需要的朋友可以參考下
    2023-11-11
  • java 中復(fù)合機(jī)制的實(shí)例詳解

    java 中復(fù)合機(jī)制的實(shí)例詳解

    這篇文章主要介紹了java 中復(fù)合機(jī)制的實(shí)例詳解的相關(guān)資料,希望通過本文大家能了解繼承和復(fù)合的區(qū)別并應(yīng)用復(fù)合這種機(jī)制,需要的朋友可以參考下
    2017-09-09
  • Spring基于常用AspectJ切點(diǎn)表達(dá)式使用介紹

    Spring基于常用AspectJ切點(diǎn)表達(dá)式使用介紹

    AspectJ是一個(gè)基于Java語言的AOP框架,使用AspectJ需要導(dǎo)入Spring?AOP和AspectJ相關(guān)jar包,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Java線程安全解決方案(synchronized,ReentrantLock,Atomic)

    Java線程安全解決方案(synchronized,ReentrantLock,Atomic)

    這篇文章主要介紹了Java線程安全解決方案(synchronized,ReentrantLock,Atomic),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java基于jcifs.smb實(shí)現(xiàn)遠(yuǎn)程發(fā)送文件到服務(wù)器

    java基于jcifs.smb實(shí)現(xiàn)遠(yuǎn)程發(fā)送文件到服務(wù)器

    這篇文章主要介紹了java基于jcifs.smb實(shí)現(xiàn)遠(yuǎn)程發(fā)送文件到服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • JAVA 聚焦 OutOfMemoryError 異常問題記錄

    JAVA 聚焦 OutOfMemoryError 異常問題記錄

    在 Java 開發(fā)中,內(nèi)存溢出異常是影響程序穩(wěn)定性的關(guān)鍵問題,了解其原理和應(yīng)對方法,對開發(fā)者至關(guān)重要,這篇文章主要介紹了JAVA聚焦 OutOfMemoryError 異常,需要的朋友可以參考下
    2025-04-04
  • 鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件的實(shí)例代碼

    鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件的實(shí)例代碼

    這篇文章主要介紹了鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • MyBatis代碼自動(dòng)生成器Mybatis-Generator的使用詳解

    MyBatis代碼自動(dòng)生成器Mybatis-Generator的使用詳解

    本文詳細(xì)介紹如何在SpringBoot項(xiàng)目中使用MyBatis-Generator進(jìn)行代碼生成,包括配置文件的添加、POM依賴配置、運(yùn)行配置等步驟,通過自動(dòng)生成代碼,可以簡化MyBatis的繁瑣配置和SQL編寫,提高開發(fā)效率,注意要考慮MySQL版本兼容性,以及確保路徑配置正確
    2024-10-10
  • Spring Profiles使用方法詳解

    Spring Profiles使用方法詳解

    在你剛接觸SpringBoot的時(shí)候有沒有對它提供的Profile有些許不適應(yīng),經(jīng)過摸索后才領(lǐng)悟到它的強(qiáng)大。今天我就對Profile進(jìn)行一點(diǎn)歸納總結(jié),留作互聯(lián)網(wǎng)記憶
    2022-12-12

最新評(píng)論

太康县| 神木县| 崇阳县| 犍为县| 冕宁县| 淮南市| 华阴市| 津市市| 车致| 祁连县| 自贡市| 临沭县| 临猗县| 西平县| 陆川县| 乌海市| 肥西县| 昌宁县| 绥中县| 鹤山市| 仁怀市| 凤山市| 泰来县| 白水县| 黔西县| 同德县| 离岛区| 静乐县| 西青区| 手游| 图木舒克市| 洱源县| 鄂尔多斯市| 石首市| 炉霍县| 民勤县| 秦安县| 蒲江县| 奉化市| 迁西县| 久治县|