Apache Commons CLI লাইব্রেরি একটি অত্যন্ত শক্তিশালী টুল যা Java অ্যাপ্লিকেশনগুলির জন্য কমান্ড লাইন আর্গুমেন্ট পার্সিং এবং অপশন হ্যান্ডলিং সহজ করে। এটি আপনাকে বিভিন্ন ধরণের Advanced Options এবং Arguments পরিচালনা করতে সহায়তা করে, যেমন অপশন প্যারামিটার, ডিফল্ট মান, অবশ্যকতা যাচাই, এবং একাধিক আর্গুমেন্ট প্যারামিটারসহ নানা ফিচার।
এই গাইডে আমরা দেখবো কিভাবে Apache Commons CLI ব্যবহার করে Advanced Option Handling এবং Argument Validation করা যায়।
Advanced Option Handling
Advanced Option Handling হল এমন ফিচার যা আপনাকে অপশনের কার্যকারিতা আরো কাস্টমাইজ করতে এবং অপশনগুলির মধ্যে জটিলতা বা সম্পর্ক তৈরি করতে সহায়তা করে। কিছু জনপ্রিয় advanced অপশন হ্যান্ডলিংয়ের মধ্যে রয়েছে:
- Required Options (অপশন অবশ্যই থাকা উচিত)
- Option with multiple arguments (একাধিক আর্গুমেন্ট সহ অপশন)
- Default Values (অপশনগুলির জন্য ডিফল্ট মান)
- Flag Options (বুলিয়ান টাইপ অপশন)
- Long and Short options (দ্বৈত এবং সংক্ষিপ্ত অপশন)
1. Required Options (অপশন অবশ্যই থাকা উচিত)
কিছু অপশন এমন হতে পারে, যেগুলির উপস্থিতি আবশ্যক। Apache Commons CLI এ আপনি setRequired(true) ব্যবহার করে অপশনগুলোকে আবশ্যক করতে পারেন।
import org.apache.commons.cli.*;
public class RequiredOptionExample {
public static void main(String[] args) {
Options options = new Options();
// অপশন তৈরি করা
Option nameOption = new Option("n", "name", true, "Your name");
nameOption.setRequired(true); // নাম অপশনটি আবশ্যক
options.addOption(nameOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
String name = cmd.getOptionValue("n");
System.out.println("Hello, " + name);
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
System.exit(1);
}
}
}
এখন, এই প্রোগ্রামটি চালানোর সময় যদি -n অপশন না দেওয়া হয়, তাহলে এটি ত্রুটি দেখাবে:
java RequiredOptionExample
আউটপুট:
Error: Missing required option: n
2. Option with Multiple Arguments (একাধিক আর্গুমেন্ট সহ অপশন)
কিছু অপশন একাধিক আর্গুমেন্ট গ্রহণ করতে পারে, যেমন একটি তালিকা বা সংখ্যা।
import org.apache.commons.cli.*;
public class MultipleArgumentsExample {
public static void main(String[] args) {
Options options = new Options();
// একাধিক আর্গুমেন্ট সহ অপশন তৈরি করা
Option filesOption = new Option("f", "files", true, "Files to process");
filesOption.setArgs(Option.UNLIMITED_VALUES); // একাধিক ফাইল পাস করা যাবে
options.addOption(filesOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
// সকল ফাইলের নাম প্রিন্ট করা
String[] files = cmd.getOptionValues("f");
for (String file : files) {
System.out.println("Processing file: " + file);
}
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
এখানে, আপনি একাধিক ফাইল নাম পাস করতে পারেন:
java MultipleArgumentsExample -f file1.txt file2.txt file3.txt
আউটপুট:
Processing file: file1.txt
Processing file: file2.txt
Processing file: file3.txt
3. Default Values (ডিফল্ট মান)
অপশনগুলির জন্য আপনি ডিফল্ট মানও সেট করতে পারেন। যদি ব্যবহারকারী কোনো মান প্রদান না করে, তাহলে এই ডিফল্ট মান ব্যবহার হবে।
import org.apache.commons.cli.*;
public class DefaultValuesExample {
public static void main(String[] args) {
Options options = new Options();
// ডিফল্ট মান সহ অপশন তৈরি করা
Option timeoutOption = new Option("t", "timeout", true, "Timeout in seconds");
timeoutOption.setRequired(false); // এটা আবশ্যক নয়
timeoutOption.setArgs(1);
timeoutOption.setOptionalArg(true); // ডিফল্ট মান গ্রহণ করবে
options.addOption(timeoutOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
// যদি timeout অপশন না দেওয়া হয়, তবে 30 সেকেন্ড ডিফল্ট
String timeout = cmd.getOptionValue("t", "30");
System.out.println("Timeout: " + timeout + " seconds");
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
এখানে, যদি -t অপশন পাস না করা হয়, তবে এটি ডিফল্টভাবে 30 সেকেন্ড ব্যবহার করবে:
java DefaultValuesExample
আউটপুট:
Timeout: 30 seconds
অথবা:
java DefaultValuesExample -t 60
আউটপুট:
Timeout: 60 seconds
4. Flag Options (বুলিয়ান টাইপ অপশন)
บาง অপশন হেডফ্ল্যাগ (Boolean flag) হিসেবে কাজ করতে পারে, যেখানে এর মান true বা false হবে। উদাহরণস্বরূপ: -v (verbose mode) বা -h (help).
import org.apache.commons.cli.*;
public class FlagOptionExample {
public static void main(String[] args) {
Options options = new Options();
// বুলিয়ান অপশন তৈরি করা (Flag option)
Option verbose = new Option("v", "verbose", false, "Enable verbose mode");
options.addOption(verbose);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
if (cmd.hasOption("v")) {
System.out.println("Verbose mode enabled.");
} else {
System.out.println("Verbose mode disabled.");
}
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
এই প্রোগ্রামটি চালানোর সময়, -v অপশন ব্যবহার করলে Verbose mode enabled. প্রিন্ট হবে, অন্যথায় Verbose mode disabled.।
java FlagOptionExample -v
আউটপুট:
Verbose mode enabled.
Argument Validation
Argument Validation হল আর্গুমেন্টগুলির যাচাই এবং তাদের সঠিকতা নিশ্চিত করার প্রক্রিয়া। আপনি চাইলে বিভিন্ন অপশনগুলির জন্য নির্দিষ্ট ভ্যালিডেশন চেক করতে পারেন।
Example: Integer Validation for Age
import org.apache.commons.cli.*;
public class ArgumentValidationExample {
public static void main(String[] args) {
Options options = new Options();
// Age অপশন
Option ageOption = new Option("a", "age", true, "Your age");
options.addOption(ageOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
// আর্গুমেন্টের মান যাচাই
String age = cmd.getOptionValue("a");
if (age != null && !age.matches("\\d+")) {
System.err.println("Invalid age: Age must be a number.");
System.exit(1);
}
System.out.println("Your age is: " + age);
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
এখানে -a অপশনের জন্য বয়েসের মান পরীক্ষা করা হচ্ছে, যা শুধুমাত্র সংখ্যার হতে হবে। যদি ব্যবহারকারী সংখ্যা না দেয়, তাহলে ত্রুটি দেখানো হবে:
java ArgumentValidationExample -a abc
আউটপুট:
Invalid age: Age must be a number.
সারাংশ
Apache Commons CLI ব্যবহার করে আপনি উন্নত অপশন এবং আর্গুমেন্ট হ্যান্ডলিং করতে পারেন, যেমন:
- Required options (অপশন আবশ্যক করা)
- Multiple arguments (একাধিক আর্গুমেন্টের সাথে অপশন)
- Default values (অপশনের জন্য ডিফল্ট মান)
- Flag options (বুলিয়ান অপশন)
- Argument validation (আর্গুমেন্ট যাচাই)
এই সব ফিচার আপনাকে একটি অত্যন্ত শক্তিশালী, নমনীয় এবং ব্যবহারকারীর জন্য সহজ কমান্ড লাইন ইন্টারফেস তৈরি করতে সাহায্য করবে। Apache Commons CLI লাইব্রেরির মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনটি আরও কার্যকরী এবং নির্ভরযোগ্য করতে পারেন।
অ্যাপাচি কমন্স সিআলআই (Apache Commons CLI) লাইব্রেরি একটি শক্তিশালী টুল যা কমান্ড লাইন আর্গুমেন্টস পার্সিংয়ের জন্য ব্যবহৃত হয়। অনেক সময় আপনাকে একটি অপশন বা সাব-কমান্ডের জন্য একাধিক আর্গুমেন্ট নিতে হতে পারে, যেমন একাধিক ফাইলের পাথ বা কয়েকটি ভ্যালু। অ্যাপাচি কমন্স সিআলআই এভাবে একাধিক আর্গুমেন্টকে সহজেই হ্যান্ডল করার জন্য সুবিধা প্রদান করে, যা ডেভেলপারদের জন্য খুবই সহায়ক।
Multiple Arguments হ্যান্ডল করার প্রয়োজনীয়তা:
- একাধিক মানের ইনপুট: কিছু অপশন বা সাব-কমান্ডে একাধিক আর্গুমেন্ট পাস করার প্রয়োজন হতে পারে। যেমন, একাধিক ফাইল বা ডেটা পয়েন্ট প্রসেস করা।
- ডাইনামিক আর্গুমেন্টস: যেখানে ব্যবহারকারী কোনো নির্দিষ্ট সংখ্যা নির্ধারণ না করে একাধিক ভ্যালু পাস করতে পারে।
অ্যাপাচি কমন্স সিআলআই একাধিক আর্গুমেন্ট গ্রহণ করার জন্য একটি সহজ পদ্ধতি সরবরাহ করে। চলুন, দেখুন কীভাবে একাধিক আর্গুমেন্ট হ্যান্ডল করা যায়।
Multiple Arguments হ্যান্ডল করার পদ্ধতি
১. একাধিক আর্গুমেন্ট গ্রহণ করা
এক্ষেত্রে, একটি অপশন তৈরি করা হয় যাতে একাধিক মান (values) পাস করা যায়। Option ক্লাসের hasArgs() মেথড ব্যবহার করে আপনি নির্দিষ্ট করতে পারেন যে একটি অপশন একাধিক আর্গুমেন্ট গ্রহণ করবে।
উদাহরণ: একাধিক আর্গুমেন্ট গ্রহণ
import org.apache.commons.cli.*;
public class MultipleArgumentsExample {
public static void main(String[] args) {
// অপশন তৈরি করা
Options options = new Options();
Option filesOption = new Option("f", "files", true, "List of files");
filesOption.setArgs(Option.UNLIMITED_VALUES); // একাধিক আর্গুমেন্ট পাস করার অনুমতি
options.addOption(filesOption);
// কমান্ড লাইন পার্সার তৈরি করা
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// কমান্ড লাইন আর্গুমেন্টস পার্স করা
cmd = parser.parse(options, args);
// পাস করা ফাইলের নামগুলো প্রিন্ট করা
if (cmd.hasOption("f")) {
String[] files = cmd.getOptionValues("f");
System.out.println("Files to process:");
for (String file : files) {
System.out.println(file);
}
} else {
System.out.println("No files provided.");
}
} catch (ParseException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
এখানে, -f অপশনের মাধ্যমে একাধিক ফাইল পাথ গ্রহণ করা হচ্ছে। setArgs(Option.UNLIMITED_VALUES) ব্যবহার করা হয়েছে যাতে যে কোনো সংখ্যক আর্গুমেন্ট পাস করা যায়।
কমান্ড লাইন আর্গুমেন্টস
java MultipleArgumentsExample -f file1.txt file2.txt file3.txt
এই কমান্ডে, -f অপশনের মাধ্যমে তিনটি ফাইল পাথ পাস করা হচ্ছে, এবং প্রোগ্রামটি সেগুলোর প্রতিটির নাম প্রিন্ট করবে:
Files to process:
file1.txt
file2.txt
file3.txt
এখানে, file1.txt, file2.txt, এবং file3.txt হল একাধিক আর্গুমেন্ট যা -f অপশনের মাধ্যমে পাস করা হয়েছে।
২. একাধিক আর্গুমেন্টের জন্য বিকল্প ফ্ল্যাগ
আপনি Option.UNLIMITED_VALUES ছাড়াও একাধিক মান গ্রহণ করতে hasArgs() মেথডের মাধ্যমে নির্দিষ্ট সংখ্যা নির্ধারণ করতে পারেন। যেমন, এক বা একাধিক মান গ্রহণ করার জন্য এটি ব্যবহৃত হতে পারে।
উদাহরণ: সীমিত সংখ্যক আর্গুমেন্ট গ্রহণ করা
import org.apache.commons.cli.*;
public class LimitedArgumentsExample {
public static void main(String[] args) {
// অপশন তৈরি করা
Options options = new Options();
Option directoryOption = new Option("d", "directories", true, "List of directories");
directoryOption.setArgs(2); // দুটি আর্গুমেন্ট পাস করার অনুমতি
options.addOption(directoryOption);
// কমান্ড লাইন পার্সার তৈরি করা
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// কমান্ড লাইন আর্গুমেন্টস পার্স করা
cmd = parser.parse(options, args);
// পাস করা ডিরেক্টরি নামগুলো প্রিন্ট করা
if (cmd.hasOption("d")) {
String[] directories = cmd.getOptionValues("d");
System.out.println("Directories to process:");
for (String dir : directories) {
System.out.println(dir);
}
} else {
System.out.println("No directories provided.");
}
} catch (ParseException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
এখানে, -d অপশনের মাধ্যমে দুইটি ডিরেক্টরি পাথ নেওয়া হচ্ছে। setArgs(2) ব্যবহার করে আপনি দুটি আর্গুমেন্ট গ্রহণ করতে নির্দেশ দিতে পারেন।
কমান্ড লাইন আর্গুমেন্টস
java LimitedArgumentsExample -d dir1 dir2
এখানে, dir1 এবং dir2 হল দুটি আর্গুমেন্ট যা -d অপশনের মাধ্যমে পাস করা হয়েছে।
সারাংশ
অ্যাপাচি কমন্স সিআলআই (Apache Commons CLI) লাইব্রেরি একাধিক আর্গুমেন্ট হ্যান্ডল করার জন্য শক্তিশালী সুবিধা প্রদান করে। আপনি setArgs() এবং Option.UNLIMITED_VALUES ব্যবহার করে একাধিক আর্গুমেন্ট পাস করতে পারেন এবং তা প্রোগ্রামের ভিতরে সঠিকভাবে পার্স করতে পারেন। এটি ডেভেলপারদের জন্য খুবই সহায়ক যখন একাধিক ভ্যালু বা ইনপুট প্যারামিটার প্রক্রিয়া করার প্রয়োজন হয়, যেমন একাধিক ফাইল পাথ, ডিরেক্টরি পাথ, অথবা ডেটা পয়েন্ট।
Apache Commons CLI লাইব্রেরি কমান্ড-লাইন অ্যাপ্লিকেশনগুলিতে আর্গুমেন্ট এবং অপশনগুলির জন্য default values এবং custom values সেট করার জন্য একটি সহজ উপায় প্রদান করে। যখন ইউজার কোনো আর্গুমেন্ট প্রদান না করেন, তখন আপনি default values সেট করতে পারেন, এবং প্রয়োজনে আপনি custom values প্রদান করতে পারেন যা নির্দিষ্ট কন্ডিশন বা ব্যবহারকারীর ইনপুটের উপর নির্ভর করবে।
এখানে আমরা দেখব কিভাবে Default values এবং Custom values সেট করা যায় Apache Commons CLI ব্যবহার করে।
১. Default Values সেট করা
কখনও কখনও, আপনি চান যে কিছু অপশনগুলির জন্য default values ব্যবহার করা হোক, যদি ইউজার সেগুলি প্রদান না করেন। Apache Commons CLI এ আপনি Option তৈরির সময় setOptionalArg(true) ব্যবহার করে এই ডিফল্ট মানটি সেট করতে পারেন।
উদাহরণ:
ধরা যাক, আমাদের একটি অ্যাপ্লিকেশন আছে, যেখানে একটি ইনপুট ফাইল (-f) এবং একটি আউটপুট ফাইল (-o) প্রদান করা হয়। যদি আউটপুট ফাইল (-o) ইউজার প্রদান না করেন, তবে আমরা একটি ডিফল্ট ফাইল নাম (output.txt) সেট করব।
import org.apache.commons.cli.*;
public class DefaultValuesExample {
public static void main(String[] args) {
// অপশন কনফিগারেশন
Options options = new Options();
// ইনপুট ফাইল অপশন (Required)
Option inputFile = new Option("f", "file", true, "Input file path");
inputFile.setRequired(true); // এটি একটি Required অপশন
options.addOption(inputFile);
// আউটপুট ফাইল অপশন (Optional, Default value সেট করা হবে)
Option outputFile = new Option("o", "output", true, "Output file path");
outputFile.setRequired(false); // এটি একটি Optional অপশন
options.addOption(outputFile);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// আর্গুমেন্ট পার্সিং
cmd = parser.parse(options, args);
// ইনপুট ফাইল নাম গ্রহণ
String input = cmd.getOptionValue("f");
System.out.println("Input file: " + input);
// আউটপুট ফাইল নাম গ্রহণ (যদি দেওয়া থাকে)
String output = cmd.getOptionValue("o");
// যদি আউটপুট ফাইল নাম না দেওয়া থাকে, ডিফল্ট সেট করা হবে
if (output == null) {
output = "output.txt";
}
System.out.println("Output file: " + output);
} catch (ParseException e) {
// যদি Required আর্গুমেন্ট না দেওয়া হয়
System.err.println("Error: " + e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("DefaultValuesExample", options);
}
}
}
ব্যাখ্যা:
Option inputFile: এই অপশনটি Required, তাই এটি অবশ্যই প্রদান করতে হবে।Option outputFile: এই অপশনটি Optional, তবে যদি ইউজার এটি প্রদান না করেন, তবে আমরা একটি default value হিসেবে"output.txt"সেট করি।cmd.getOptionValue("o"): আউটপুট ফাইল অপশন থেকে মান নেওয়া হয়েছে এবং যদি এটি প্রদান না করা হয়, তাহলে"output.txt"ডিফল্টভাবে সেট করা হয়।
আউটপুট:
- যদি আপনি আউটপুট ফাইলের নাম না দেন:
java DefaultValuesExample -f input.txt
আউটপুট:
Input file: input.txt
Output file: output.txt
- যদি আপনি আউটপুট ফাইলের নাম দেন:
java DefaultValuesExample -f input.txt -o result.txt
আউটপুট:
Input file: input.txt
Output file: result.txt
২. Custom Values সেট করা
কিছু ক্ষেত্রে, আপনি চান যে কিছু অপশন custom values গ্রহণ করুক, যা ব্যবহারকারীর ইনপুট বা অন্য কোন কন্ডিশনের উপর নির্ভর করবে। Apache Commons CLI এ আপনি Option এর setValueSeparator() বা setArgName() ব্যবহার করে কাস্টম মান সেট করতে পারেন।
উদাহরণ:
ধরা যাক, আপনি একটি অ্যাপ্লিকেশন তৈরি করেছেন যেখানে ইউজার একটি অপশন থেকে একটি কাস্টম মান নির্বাচন করবে, যেমন একটি ইমেল প্রেরণের জন্য SMTP সার্ভারের নাম এবং পোর্ট নম্বর।
import org.apache.commons.cli.*;
public class CustomValuesExample {
public static void main(String[] args) {
// অপশন কনফিগারেশন
Options options = new Options();
// SMTP সার্ভার এবং পোর্ট অপশন
Option smtpOption = new Option("s", "smtp", true, "SMTP server and port");
smtpOption.setRequired(true);
options.addOption(smtpOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// আর্গুমেন্ট পার্সিং
cmd = parser.parse(options, args);
// SMTP সার্ভার এবং পোর্ট গ্রহণ
String smtpValue = cmd.getOptionValue("s");
// কাস্টম মান (SMTP সার্ভার এবং পোর্ট) সেট করা
String[] smtpDetails = smtpValue.split(":");
String server = smtpDetails[0];
String port = smtpDetails[1];
System.out.println("SMTP Server: " + server);
System.out.println("SMTP Port: " + port);
} catch (ParseException e) {
// যদি Required আর্গুমেন্ট না দেওয়া হয়
System.err.println("Error: " + e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("CustomValuesExample", options);
}
}
}
ব্যাখ্যা:
Option smtpOption: এই অপশনটি Required এবং এটি SMTP server and port কে গ্রহণ করে। ইউজারকে এটিserver:portফরম্যাটে প্রদান করতে হবে (যেমনsmtp.example.com:25)।split(":"):split(":")ব্যবহার করে আমরা সার্ভার নাম এবং পোর্ট আলাদা করি, যা ইউজার প্রদান করবে।
আউটপুট:
- যদি আপনি SMTP সার্ভার এবং পোর্ট প্রদান করেন:
java CustomValuesExample -s smtp.example.com:25
আউটপুট:
SMTP Server: smtp.example.com
SMTP Port: 25
৩. Dynamic Custom Values
আপনি চাইলে ইউজারের ইনপুট অনুযায়ী কাস্টম মান পরিবর্তন করতে পারেন। ধরুন, একটি কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করছেন যা ইউজারের প্রদত্ত পোর্ট নম্বর অনুযায়ী একটি নির্দিষ্ট কাজ করবে, যেমন একটি সার্ভার চালু করা।
উদাহরণ:
import org.apache.commons.cli.*;
public class DynamicCustomValuesExample {
public static void main(String[] args) {
// অপশন কনফিগারেশন
Options options = new Options();
// পোর্ট নম্বর অপশন
Option portOption = new Option("p", "port", true, "Port number for the server");
portOption.setRequired(true); // এই অপশনটি Required
options.addOption(portOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// আর্গুমেন্ট পার্সিং
cmd = parser.parse(options, args);
// পোর্ট নম্বর গ্রহণ
String port = cmd.getOptionValue("p");
int portNumber = Integer.parseInt(port);
// কাস্টম মান যাচাই এবং কাজ করা
if (portNumber == 8080) {
System.out.println("Starting server on port 8080...");
} else {
System.out.println("Starting server on port " + portNumber + "...");
}
} catch (ParseException e) {
// যদি Required আর্গুমেন্ট না দেওয়া হয়
System.err.println("Error: " + e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("DynamicCustomValuesExample", options);
} catch (NumberFormatException e) {
System.err.println("Error: Invalid port number format.");
}
}
}
ব্যাখ্যা:
- Dynamic Custom Values: এখানে আমরা ইউজারের প্রদত্ত পোর্ট নম্বরের উপর ভিত্তি করে একটি বিশেষ কাজ করতে চাই (যেমন পোর্ট 8080 হলে সার্ভার চালু করা)।
Integer.parseInt(): ইউজারের ইনপুট পোর্ট নম্বরটিকে Integer এ কনভার্ট করা হয়েছে এবং তারপরে তা ব্যবহার করা হয়েছে।
আউটপুট:
- যদি আপনি পোর্ট 8080 প্রদান করেন:
java DynamicCustomValuesExample -p 8080
আউটপুট:
Starting server on port 8080...
- যদি আপনি অন্য কোন পোর্ট প্রদান করেন:
java DynamicCustomValuesExample -p 9090
আউটপুট:
Starting server on port 9090...
সারাংশ
Apache Commons CLI ব্যবহার করে আপনি Default values এবং Custom values সহজেই সেট করতে পারেন:
- Default Values: আপনি অপশনগুলির জন্য ডিফল্ট মান নির্ধারণ করতে পারেন, যাতে ইউজার যদি কোনো মান প্রদান না করেন, তবে সেই ডিফল্ট মান ব্যবহার করা হয়।
- Custom Values: ইউজারের ইনপুট অনুযায়ী কাস্টম মান নির্ধারণ এবং সেট করা সম্ভব। আপনি
split(),parse(), অথবা অন্যান্য কাস্টম লজিক ব্যবহার করে এই মান প্রক্রিয়া করতে পারেন।
এভাবে, আপনি CLI অ্যাপ্লিকেশনগুলিতে default এবং custom মান ব্যবহারের মাধ্যমে ফিচার এবং কার্যকারিতা কাস্টমাইজ করতে পারবেন।
Apache Commons CLI লাইব্রেরি কমান্ড লাইন অ্যাপ্লিকেশনে আর্গুমেন্ট পার্সিং এবং অপশন হ্যান্ডলিংয়ের জন্য খুবই শক্তিশালী একটি টুল। একটি OptionGroup হলো অপশনগুলির একটি গ্রুপ, যেখানে আপনি একটি গ্রুপের মধ্যে থাকা অপশনগুলির মধ্যে শুধুমাত্র একটি নির্বাচন করতে পারবেন।
যখন আপনি Multiple OptionGroups এর সমন্বয় করতে চান, তখন একটি গ্রুপের মধ্যে থাকা একাধিক অপশনকে একসাথে ব্যবহার করা যাবে না, তবে আপনি একাধিক গ্রুপের মধ্যে থাকা অপশনগুলির বিভিন্ন সংমিশ্রণ ব্যবহার করতে পারেন। এই কৌশলটি খুবই কার্যকরী যখন আপনার কমান্ড লাইন অ্যাপ্লিকেশনটিতে বিভিন্ন ধরনের অপশন গ্রুপের প্রয়োজন হয়, যা একে অপরের সাথে সম্পর্কিত হলেও তাদের মধ্যে কিছু সীমাবদ্ধতা থাকতে পারে।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Multiple OptionGroups ব্যবহার করা যায় এবং সেগুলির সমন্বয় কিভাবে করা যায়।
OptionGroup এর ধারণা
OptionGroup হল এমন একটি ধারণা যেখানে আপনি একাধিক অপশন (যেমন -a, -b, -c) সংজ্ঞায়িত করেন এবং ব্যবহারকারীকে সেই গ্রুপের মধ্যে একটিই অপশন নির্বাচন করতে বাধ্য করেন। অর্থাৎ, ব্যবহারকারী যদি একটি অপশন ব্যবহার করেন, তবে অন্য অপশনগুলো ব্যবহার করা যাবে না।
Multiple OptionGroups হলে, আপনি একাধিক গ্রুপ ব্যবহার করতে পারবেন, যেখানে প্রতিটি গ্রুপের মধ্যে শুধুমাত্র একটি অপশন নির্বাচন করা যাবে, কিন্তু একাধিক গ্রুপের অপশন একসাথে ব্যবহার করা যাবে।
Multiple OptionGroup এর উদাহরণ
ধরি, আমাদের একটি অ্যাপ্লিকেশন আছে যেখানে দুটি গ্রুপ রয়েছে:
- Action Group: এই গ্রুপের মধ্যে একটি অপশন থাকতে হবে —
-startবা-stop - Output Group: এই গ্রুপের মধ্যে একটি অপশন থাকতে হবে —
-jsonবা-xml
আমরা চাই, ব্যবহারকারী একে অপরের সাথে একটি অপশন ব্যবহার করতে পারেন, তবে দুইটি গ্রুপের মধ্যে থেকে একটি অপশন বেছে নিতে হবে।
কোড উদাহরণ:
import org.apache.commons.cli.*;
public class MultipleOptionGroupExample {
public static void main(String[] args) {
// অপশন গ্রুপ তৈরি
Options options = new Options();
// Action গ্রুপ তৈরি (start বা stop)
OptionGroup actionGroup = new OptionGroup();
actionGroup.addOption(new Option("start", false, "Start the application"));
actionGroup.addOption(new Option("stop", false, "Stop the application"));
// Output গ্রুপ তৈরি (json বা xml)
OptionGroup outputGroup = new OptionGroup();
outputGroup.addOption(new Option("json", false, "Output in JSON format"));
outputGroup.addOption(new Option("xml", false, "Output in XML format"));
// অপশন গ্রুপগুলো সংযুক্ত করা
options.addOptionGroup(actionGroup);
options.addOptionGroup(outputGroup);
// পার্সার তৈরি
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
try {
// কমান্ড লাইন আর্গুমেন্ট পার্স করা
CommandLine line = parser.parse(options, args);
// Action গ্রুপ চেক করা
if (line.hasOption("start")) {
System.out.println("Application is starting...");
} else if (line.hasOption("stop")) {
System.out.println("Application is stopping...");
} else {
System.out.println("Error: You must specify either -start or -stop.");
return;
}
// Output গ্রুপ চেক করা
if (line.hasOption("json")) {
System.out.println("Output will be in JSON format.");
} else if (line.hasOption("xml")) {
System.out.println("Output will be in XML format.");
} else {
System.out.println("Error: You must specify either -json or -xml.");
}
} catch (ParseException exp) {
System.out.println("Error parsing the command line: " + exp.getMessage());
formatter.printHelp("MultipleOptionGroupExample", options);
}
}
}
কোডের ব্যাখ্যা:
- OptionGroup তৈরি করা হয়েছে দুটি — একটির নাম actionGroup এবং অন্যটির নাম outputGroup।
- Action Group এর মধ্যে দুটি অপশন রয়েছে —
-startএবং-stop। - Output Group এর মধ্যে দুটি অপশন রয়েছে —
-jsonএবং-xml। - OptionGroup.addOption() মেথড ব্যবহার করে প্রতিটি গ্রুপে অপশন যোগ করা হয়েছে এবং তারপর সেগুলোকে Options অবজেক্টে যুক্ত করা হয়েছে।
- কমান্ড লাইন আর্গুমেন্ট পার্স করার পরে, hasOption() মেথড ব্যবহার করে গ্রুপের অপশন চেক করা হচ্ছে। গ্রুপে একটি অপশন থাকতে হবে এবং অন্যটি নির্বাচন করা যাবে না।
আউটপুট:
যদি
-startএবং-jsonঅপশন দেওয়া হয়:java MultipleOptionGroupExample -start -json Application is starting... Output will be in JSON format.যদি
-stopএবং-xmlঅপশন দেওয়া হয়:java MultipleOptionGroupExample -stop -xml Application is stopping... Output will be in XML format.যদি একাধিক অপশন একসাথে দেওয়া হয় (যেমন
-start -stop), তাহলে এটি ত্রুটি দেখাবে:java MultipleOptionGroupExample -start -stop Error: You must specify either -start or -stop.যদি কোনো অপশন দেওয়া না হয়:
java MultipleOptionGroupExample Error: You must specify either -start or -stop.
Multiple OptionGroup এর সুবিধা
- বিভিন্ন আর্গুমেন্ট গ্রুপ ব্যবস্থাপনা: যখন আপনার অ্যাপ্লিকেশনটি একাধিক ধরনের ইনপুট গ্রহণ করে, তখন OptionGroup এর মাধ্যমে সেই ইনপুটগুলোকে গ্রুপ করে রাখা সহজ হয়।
- সুসংগঠিত এবং পরিষ্কার কমান্ড লাইন: একাধিক অপশন একত্রে না গিয়ে, একে অপরের সঙ্গে সম্পর্কিত অপশনগুলোকে একটি গ্রুপের মধ্যে রাখলে কমান্ড লাইন আর্গুমেন্ট আরো পরিষ্কার হয়।
- কমান্ড লাইন ত্রুটি হ্যান্ডলিং: OptionGroup এর মাধ্যমে আপনি সহজেই যাচাই করতে পারেন যে ব্যবহারকারী গ্রুপের মধ্যে একাধিক অপশন ব্যবহার করছেন কিনা এবং সেই অনুযায়ী ত্রুটি বার্তা প্রদান করতে পারেন।
সারাংশ
Apache Commons CLI এর Multiple OptionGroup ব্যবহার করে আপনি সহজেই একাধিক অপশন গ্রুপ তৈরি করতে পারেন, যেখানে প্রতিটি গ্রুপের মধ্যে একটি অপশন থাকতে হবে এবং অন্যান্য অপশন নির্বাচন করা যাবে না। এটি অ্যাপ্লিকেশনটির আর্গুমেন্ট হ্যান্ডলিং আরও সুসংগঠিত এবং ব্যবহারকারী-বান্ধব করে তোলে। OptionGroup ব্যবহার করে আপনি গ্রুপের মধ্যে থাকা অপশনগুলোকে একত্রিত করতে পারেন এবং সেগুলির মধ্যে সঠিক সমন্বয় বজায় রাখতে পারেন, যাতে অ্যাপ্লিকেশনটি আরও শক্তিশালী এবং উন্নত হয়।
Apache Commons CLI লাইব্রেরি কমান্ড লাইন আর্গুমেন্ট প্রক্রিয়াকরণের জন্য একটি শক্তিশালী টুল, যা আপনাকে জটিল কমান্ড লাইন স্ট্রাকচার তৈরি এবং সেগুলি সহজে পার্স করতে সহায়তা করে। জটিল কমান্ড লাইন স্ট্রাকচার প্রায়ই একাধিক বিকল্প, আর্গুমেন্ট, সাব-কমান্ড, এবং অবস্থানগত আর্গুমেন্ট নিয়ে গঠিত হয়। Apache Commons CLI এই সমস্ত কিছুকে সঠিকভাবে ম্যানেজ করতে সক্ষম, এবং এটি কমান্ড লাইন ইনপুটকে সহজ ও কার্যকরীভাবে প্রক্রিয়া করতে সাহায্য করে।
এখানে আমরা Complex Command Line Structures এবং সেগুলির Parsing নিয়ে আলোচনা করব, যা আপনাকে একাধিক বিকল্প এবং সাব-কমান্ড নিয়ে কাজ করতে সহায়ক হবে।
Complex Command Line Structures
জটিল কমান্ড লাইন স্ট্রাকচার সাধারণত এই সমস্ত উপাদান নিয়ে গঠিত হতে পারে:
- বিকল্প (Options):
-h,--file,-vইত্যাদি। - বাধ্যতামূলক আর্গুমেন্ট (Positional Arguments): যেমন ইনপুট ফাইল, আউটপুট ফাইল।
- ঐচ্ছিক আর্গুমেন্ট (Optional Arguments): যেমন
--verbose,--help। - Sub-commands: যেমন
add,remove,listইত্যাদি।
অ্যাপাচি কমন্স সিআলআই ব্যবহার করে আপনি এই ধরনের জটিল স্ট্রাকচারগুলি কার্যকরভাবে ম্যানেজ করতে পারেন। নিচে এমন একটি উদাহরণ দেওয়া হল যেখানে একাধিক বিকল্প, পজিশনাল আর্গুমেন্ট, এবং সাব-কমান্ডগুলির মধ্যে সম্পর্ক প্রতিষ্ঠিত হচ্ছে।
উদাহরণ: Complex Command Line Structure
ধরা যাক আমরা একটি ফাইল ম্যানেজমেন্ট টুল তৈরি করছি যেখানে ব্যবহারকারী add, remove, অথবা list সাব-কমান্ডের মাধ্যমে ফাইল পরিচালনা করতে পারেন। এই কমান্ডে অনেক বিকল্প থাকবে যেমন -f (ফাইলের নাম), -v (ভের্বোজ মোড), -o (আউটপুট ফাইল), এবং --help (সহায়ক বার্তা)।
কোড উদাহরণ:
import org.apache.commons.cli.*;
public class ComplexCLIExample {
public static void main(String[] args) {
// বিকল্প তৈরি করা
Options options = new Options();
// --help বিকল্প
Option helpOption = new Option("h", "help", false, "Show help");
options.addOption(helpOption);
// --verbose ফ্ল্যাগ
Option verboseOption = new Option("v", "verbose", false, "Enable verbose output");
options.addOption(verboseOption);
// --file এবং --output বিকল্প
Option fileOption = new Option("f", "file", true, "Input file");
options.addOption(fileOption);
Option outputOption = new Option("o", "output", true, "Output file");
options.addOption(outputOption);
// Sub-command: add, remove, list
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
// --help চেক করা
if (cmd.hasOption("h")) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("ComplexCLIExample", options);
return;
}
// --verbose ফ্ল্যাগ চেক করা
if (cmd.hasOption("v")) {
System.out.println("Verbose mode enabled");
}
// --file এবং --output আর্গুমেন্ট চেক করা
if (cmd.hasOption("f")) {
String file = cmd.getOptionValue("f");
System.out.println("Input file: " + file);
}
if (cmd.hasOption("o")) {
String outputFile = cmd.getOptionValue("o");
System.out.println("Output file: " + outputFile);
}
// পজিশনাল আর্গুমেন্ট (sub-command) চেক করা
if (args.length > 0) {
String command = args[0];
switch (command) {
case "add":
System.out.println("Adding file...");
break;
case "remove":
System.out.println("Removing file...");
break;
case "list":
System.out.println("Listing files...");
break;
default:
System.out.println("Unknown command: " + command);
}
}
} catch (ParseException e) {
System.out.println("Error parsing command line: " + e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("ComplexCLIExample", options);
}
}
}
ব্যাখ্যা:
- Options তৈরি:
-fবা--file: ইনপুট ফাইলের জন্য আর্গুমেন্ট।-oবা--output: আউটপুট ফাইলের জন্য আর্গুমেন্ট।-vবা--verbose: ভের্বোজ মোড সক্রিয় করার জন্য ফ্ল্যাগ।-hবা--help: সহায়ক বার্তা দেখানোর জন্য।
- Sub-commands:
- কমান্ড লাইনে পজিশনাল আর্গুমেন্ট হিসেবে
add,remove, এবংlistসাব-কমান্ডগুলি চেক করা হয়।
- কমান্ড লাইনে পজিশনাল আর্গুমেন্ট হিসেবে
- CommandLine Parsing:
CommandLineParserক্লাসের মাধ্যমেargsপার্স করা হয়।- তারপর কমান্ডের প্রথম আর্গুমেন্ট (যেমন
add,remove, বাlist) অনুযায়ী সাব-কমান্ডের জন্য এক্সিকিউট করা হয়।
- HelpFormatter:
--helpফ্ল্যাগ চেক করা হলে ব্যবহারকারীকে কমান্ডের সঠিক ব্যবহারের জন্য সহায়ক বার্তা প্রদর্শন করা হয়।
কমান্ড লাইনের উদাহরণ:
ফাইল যোগ করা:
java ComplexCLIExample add -f input.txt -o output.txt -vআউটপুট:
Verbose mode enabled Input file: input.txt Output file: output.txt Adding file...ফাইল মুছে ফেলা:
java ComplexCLIExample remove -f input.txtআউটপুট:
Input file: input.txt Removing file...ফাইল তালিকা দেখানো:
java ComplexCLIExample list -f input.txtআউটপুট:
Input file: input.txt Listing files...সহায়ক বার্তা:
java ComplexCLIExample -hআউটপুট:
Usage: ComplexCLIExample [options] Options: -h, --help Show help -v, --verbose Enable verbose output -f, --file <file> Input file -o, --output <file> Output file
Sub-command Parsing এবং Validation এর সুবিধা
- নমনীয়তা: আপনি একাধিক সাব-কমান্ড এবং বিকল্প ব্যবহার করতে পারেন, যার ফলে আপনার কমান্ড লাইন অ্যাপ্লিকেশনটি বিভিন্ন কার্যক্রম পরিচালনা করতে সক্ষম হয়।
- ভুল ইনপুট প্রতিরোধ: সাব-কমান্ড এবং বিকল্পগুলির ভ্যালিডেশন খুব সহজে করা যায়, যা ভুল ইনপুট প্রক্রিয়া এবং অ্যাপ্লিকেশন ক্র্যাশের সম্ভাবনা কমায়।
- সহজ ইউজার ইন্টারফেস: কমান্ড লাইনে সাব-কমান্ড এবং বিকল্পগুলির ব্যবহার স্পষ্টভাবে সংজ্ঞায়িত করে, যা ব্যবহারকারীদের জন্য সহজ ও কার্যকরী করে তোলে।
Apache Commons CLI-তে Complex Command Line Structures এবং Parsing ব্যবস্থাপনা খুবই সহজ এবং নমনীয়। সাব-কমান্ড এবং বিকল্পগুলির ম্যানেজমেন্টের মাধ্যমে আপনি জটিল CLI অ্যাপ্লিকেশন তৈরি করতে পারেন। HelpFormatter এবং CommandLineParser এর মাধ্যমে কমান্ড লাইনের আর্গুমেন্ট এবং বিকল্পগুলির সঠিক প্রক্রিয়া নিশ্চিত করা সম্ভব। এই কৌশলগুলি ব্যবহার করে আপনি আরও শক্তিশালী এবং কার্যকরী কমান্ড লাইন অ্যাপ্লিকেশন তৈরি করতে পারবেন।
Read more