Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

drawing

Cli-Plus - Writing Command Line Instructions in Java

Cli-Plus is an open source framework for writing command-line commands in Java. It is simple, efficient, and easy to use, and can improve team work efficiency.

Introduction

This is a framework for writing command-line instruction sets using java

For detailed instructions, see: https://jdk.plus/pages/2ba02f/

Maven Dependencies

<dependency>
<groupId>plus.jdk</groupId>
<artifactId>cli-plus</artifactId>
<version>1.1.5</version>
</dependency>

Some interesting components

See the effect through code execution

(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.ProgressBarTest#testProgressBar test -q
Processing [========================================>] 100% 128/128
(base) ➜ cli-plus git:(master) ✗ mvn -Dtest=plus.jdk.cli.weight.TablePrinterTest#printTable test -q
+----+----------------+------+--------+
| id | 姓名 | 年龄 | 性别 |
+----+----------------+------+--------+
| 1 | 张三💅 | 30 ||| 2 | 李四 | 89 ||| 3 | 王老五 | 30 | 男👵👲 || 4 | chang kai shen | 30 ||| 4 | p-moon ☺️☺️ | 30 | 未知 |
+----+----------------+------+--------+

How to define a command line and declare parameters

How to define a command

packageplus.jdk.cli.command;
importplus.jdk.cli.JCommandLinePlus;
importplus.jdk.cli.annotation.CommandLinePlus;
importplus.jdk.cli.annotation.CommandParameter;
importplus.jdk.cli.annotation.SubInstruction;
importjava.util.List;
importjava.util.Set;
@CommandLinePlus(description = "This is a test command line")
publicclassTestJCommandextendsJCommandLinePlus {
/** * You can use the required option to specify that this parameter must be entered. * Call the implemented validate() function to validate the parameters */@CommandParameter(name = "u", longName = "uid", needArgs = true, description = "用户id", required = true)
privateLonguid;
@CommandParameter(name = "p", longName = "phone", needArgs = true, description = "user phone")
privateStringphone;
/** * For easy option,you can use, -<name> or --<longName> declare parameters,for example, -e xxx@jdk.plus, or --email xxx@jdk.plus */@CommandParameter(name = "e", longName = "email", needArgs = true, description = "user email")
privateStringemail;
/** * You can use multiple options to specify the list,for example : -d d1 -d d2 --data d3 */@CommandParameter(name = "d", longName = "data", needArgs = true, description = "args list")
privateList<String> dataList;
/** * You can use multiple options to specify the set,for example : -s d1 -s d2 --set d3 */@CommandParameter(name = "s", longName = "set", needArgs = true, description = "args set")
privateSet<String> dataSet;
/** * For options that do not require parameters,You can use Boolean type to receive, * For example, specify -h or --help, the value will be assigned to true, otherwise false */@CommandParameter(name = "h", longName = "help", needArgs = false, description = "display help information")
privateBooleanhelp;
/** * You can use @SubInstruction annotations to define subcommands,  * whenever the instruction specifies that the sub-instruction is required to be executed, * then the logic in the sub-instruction will be executed directly, * no longer execute the task in the current command */@SubInstruction@CommandParameter(name = "sub", longName = "subInstruction", needArgs = false, description = "this is a subcommands")
privateTestSubInstructionsubInstruction;
@OverridepublicvoiddoInCommand() throwsException {
if(help) { // Show help if the -h or --help option is specifiedshowUsage();
return;
}
validate();
// to do something according to Input parameters// which has been assigned to a member variable
}
publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
testCommand.run(args);
}
}

Execute a custom set of instructions:

java -jar xxx.jar -u 123567 -p "p2data ss" --email xxx@jdk.plus -h -s s1 -s s2 --set s3 -d d1 -d d2 --data d3

According to the parameter passing described above, the effect of execution is as follows

About some default configuration files

You need to specify cli-plus.properties in your project resources directory.

Of course, it is also possible to not specify, and the default configuration provided by us will be used.

plus.jdk.help.header.welcome=Welcome to use cli-plus
plus.jdk.help.header.description=The command options are described below:
plus.jdk.help.footer.description=usage: xxx-tool -cn xx -e "ls /root"
plus.jdk.help.footer.contact=mail: moon@jdk.plus

How to display help information for commands and subcommands

Calling the encapsulated showUsage method can generate and print help information, for example:

Of course, if you are not satisfied with this style, you can override the showUsage method to customize the help information for your instruction set

About encapsulation of instructions use shell

#!/bin/bash# 指定运行时的JAVA_HOME#JAVA_HOME=${HOME}/.biz-tools/java-se-8u41-ri#PATH=${JAVA_HOME}/bin:$PATHif! which java > /dev/null ;thenecho"jdk is not installed, please install the version above 1.8"exitfi
JAVA_VERSION=$(java -version 2>&1| sed '1!d'| sed -e 's/"//g'| awk '{print $3}')if [[ !"${JAVA_VERSION}"=~ ^1.8.0.* ]];thenecho"The jdk version must be greater than or equal to 1.8, please check the environment configuration"exitfi
TOOLS_JAR=$(dirname "$0")/tools.jar
# shellcheck disable=SC2046
java -jar "${TOOLS_JAR}""$@" -c $(dirname "$0")/conf/config.properties

How to read your config

We encapsulate the initializationConfig function to help you read the configuration. This function can be used with the PropertiesValue annotation to convert the configuration content into the configuration of the entity class.

How to define entity classes

packageplus.jdk.cli.model;
importlombok.Data;
importplus.jdk.cli.annotation.PropertiesValue;
@DatapublicclassCliHelpModel {
@PropertiesValue("plus.jdk.help.header.welcome")
privateStringheaderWelcome;
/** * You can use the resource and path parameters to specify the banner location to output */@PropertiesValue(value = "plus.jdk.help.header.banner", resource = true, path = "banner/banner.txt")
privateStringbanner;
@PropertiesValue("plus.jdk.help.header.description")
privateStringheaderDesc;
@PropertiesValue("plus.jdk.help.footer.description")
privateStringfooterDesc;
@PropertiesValue("plus.jdk.help.footer.contact")
privateStringfooterContact;
}

As you can see, the content in the configuration will assign values to the member variables of the entity class according to your annotation decoration

An example of reading a configuration file

importstaticplus.jdk.cli.common.PropertiesUtil.initializationConfig;
//...CliHelpModelcliHelpModel = initializationConfig(CliHelpModel.class, "cli-plus.properties", true);
//...

Add support for special types

If your input parameters need to specify some custom types (currently only Boolean, Long, String, Integer are supported).

Customize your own type adapter

You can customize the related serialization functions by implementing the ITypeAdapter interface.

An example is as follows, the following is an example of the serialization implementation of the Long type:

packageplus.jdk.cli.type.adapter;
importcom.google.gson.TypeAdapter;
publicclassLongTypeAdapterimplementsITypeAdapter<Long> {
@OverridepublicLongdeserialize(StringdataStr) {
if(dataStr == null) {
returnnull;
}
returnLong.parseLong(dataStr);
}
@OverridepublicStringserialize(Longdata) {
if(data == null) {
returnnull;
}
returnString.valueOf(data);
}
}

Register the implemented adapter

@CommandLinePlus(description = "this is a test command")
publicclassTestJCommandextendsJCommandLinePlus {
// ...publicstaticvoidmain(String[] args) throwsException {
TestJCommandtestCommand = newTestJCommand();
// Register your own implemented adapter component before completing the callOptions.registerTypeAdapter(Long.class, newLongTypeAdapter()); testCommand.run(args);
}
}

About

A framework for writing command-line instruction sets using java, https://jdk.plus/cli-plus/

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages