https://blog.csdn.net/jkhere/article/details/8674019
https://sophia0130.github.io/2018/05/08/CommandLineParse%E7%B1%BB/
https://blog.csdn.net/ylf_2278880589/article/details/80811304
Java命令行选项解析之Commons-CLI & Args4J & JCommander
CommandLineParser类:命令行解析
这个类的出现主要是方便用户在命令行使用过程中减少工作量,可以在程序文件中直接指定命令行中的参数指令,方便了调试。
1. C++ 例子:

#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <ctype.h>
#include <string>
using namespace cv;
using namespace std;
const char* keys =
{
"{ c | camera | 0 | use camera or not}"
"{ fn | filename |xxxx.avi | movie file}"
"{ t | test | test string | good day!}"
};
int main(int argc, const char** argv )
{
CommandLineParser parser(argc, argv, keys);
bool useCamera = parser.get<bool>("c");//括号里写成“camera”也可以
string file = parser.get<string>("fn");
string third = parser.get<string>("t");
//打印输出
cout<<useCamera<<endl;
cout<<file<<endl;
cout<<third<<endl;
cout<<endl;
parser.printParams();//CommandLineParser的成员函数,打印全部参数,还有其他成员函数,如:has(),getString()等
return 0;
}
运行结果:

大概可以看出来用这个类的好处就是很方便,因为以前版本没这个类时,如果要运行带参数的.exe,必须在命令行中输入文件路径以及各种参数,并且输入的参数格式要与代码中的if语句判断内容格式一样,一不小心就输错了,很不方便。另外如果想要更改输入格式的话在主函数文件中要相应更改很多地方。现在有了这个类,只需要改keys里面的内容就可以了,并且可以直接运行,不需要cmd命令行带参运行。最后这个类封装了很多函数,可以直接用,只不过这个本来就是类结构的优点。
————————————————
版权声明:本文为CSDN博主「JKhere」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jkhere/article/details/8674019
2.更简单的c++例子:

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
const char* keys =
{
"{input |C:/Users/king/Pictures/Saved Pictures/1.jpg| string |input image}"
};
//分别表示简称,文件来源,文件值和帮助语句
int main(int argc, char** argv)
{
Mat src, dst;
const char* source_window = "Source image";
const char* equalized_window = "Equalized Image";
// Load image
CommandLineParser parser(argc, argv, keys);
src = imread(parser.get<String>("input"), IMREAD_COLOR);
if (src.empty())
{
cout << "Could not open or find the image!\n" << endl;
return -1;
}
cvtColor(src, src, COLOR_BGR2GRAY);
equalizeHist(src, dst);
namedWindow(source_window, WINDOW_AUTOSIZE);
namedWindow(equalized_window, WINDOW_AUTOSIZE);
imshow(source_window, src);
imshow(equalized_window, dst);
waitKey(0);
return 0;
}
1.这个类的作用
以前没这个类时,如果要运行带参数的.exe,必须在命令行中输入文件路径以及各种参数,一不小心就输错了,很不方便。
现在有了这个类,只需要改keys里面的内容就可以了,并且运行时可以直接在vs下用F5,不需要cmd命令行带参运行。
2.keys
keys中间的内容分成4断,用”|”分隔开,分别表示简称,文件来源,文件值和帮助语句 PS:文件的值我不是很理解,如果类型是bool,那就有值0或,如果是类型是图像,它的值可以省略,我这边文件的值用了string,也运行成功了。
3. Java构建命令行启动模式CommandLineParser/Options

public void parseArgs(String[] args) throws ParseException {
// Create a Parser
CommandLineParser parser = new BasicParser( );
Options options = new Options( );
options.addOption("h", "help", false, "Print this usage information");
options.addOption("c", "cfg", true, "config Absolute Path");
options.addOption("l", "log", true, "log configuration");
// Parse the program arguments
CommandLine commandLine = parser.parse( options, args );
// Set the appropriate variables based on supplied options
if( commandLine.hasOption('h') ) {
printHelpMessage();
System.exit(0);
}
if( commandLine.hasOption('c') ) {
cfg = new File(commandLine.getOptionValue('c'));
} else {
printHelpMessage();
System.exit(0);
}
if( commandLine.hasOption('l') ) {
log = new File(commandLine.getOptionValue('l'));
} else {
printHelpMessage();
System.exit(0);
}
}
public void printHelpMessage() {
System.out.println( "Change the xml File and Log.XML Path to the right Absolute Path base on your project Location in your computor");
System.out.println("Usage example: ");
System.out.println( "java -cfg D:\\MyProject\\face2face\\logic\\src\\main\\resources\\logic.xml -log D:\\MyProject\\face2face\\logic\\src\\main\\resources\\log.xml");
System.exit(0);
}
在上述代码中
options.addOption("c", "cfg", true, "config Absolute Path"); //第三个参数为true表示需要额外参数:
如定义:

String[] arg = {"-t","-c","hello"};//这里参数c在下面定义为需要额外参数,这里是"hello"
public void testOption(String[] args) throws ParseException{
Options options = new Options();
options.addOption("t",false,"display current time");
options.addOption("c",true,"country code");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
if(cmd.hasOption("t")) {
System.out.println((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())+" in "+cmd.getOptionValue("c"));//这里调用cmd.getOptionValue("c")会输出hello
}else{
System.out.println((new SimpleDateFormat("yyyy-MM-dd")).format(new Date()));
}}
————————————————
版权声明:本文为CSDN博主「静心安心」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ylf_2278880589/article/details/80811304
