জাভাতে কমান্ড লাইন যুক্তি পার্স করার একটি ভাল উপায় কী?
How to parse java command line arguments?
। তবে সত্যিই কেউ এটি করতে কোড লিখতে চান না বরং একটি সরঞ্জাম ব্যবহার করতে চান। তবে সরঞ্জাম এবং পছন্দগুলি অনুসন্ধান করা গঠনমূলক নয় :(
জাভাতে কমান্ড লাইন যুক্তি পার্স করার একটি ভাল উপায় কী?
How to parse java command line arguments?
। তবে সত্যিই কেউ এটি করতে কোড লিখতে চান না বরং একটি সরঞ্জাম ব্যবহার করতে চান। তবে সরঞ্জাম এবং পছন্দগুলি অনুসন্ধান করা গঠনমূলক নয় :(
উত্তর:
এগুলি পরীক্ষা করে দেখুন:
অথবা আপনার নিজস্ব রোল:
উদাহরণস্বরূপ, আপনি এইভাবে commons-cli
2 স্ট্রিংয়ের যুক্তিগুলি পার্স করতে ব্যবহার করেন:
import org.apache.commons.cli.*;
public class Main {
public static void main(String[] args) throws Exception {
Options options = new Options();
Option input = new Option("i", "input", true, "input file path");
input.setRequired(true);
options.addOption(input);
Option output = new Option("o", "output", true, "output file");
output.setRequired(true);
options.addOption(output);
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("utility-name", options);
System.exit(1);
}
String inputFilePath = cmd.getOptionValue("input");
String outputFilePath = cmd.getOptionValue("output");
System.out.println(inputFilePath);
System.out.println(outputFilePath);
}
}
কমান্ড লাইন থেকে ব্যবহার:
$> java -jar target/my-utility.jar -i asd
Missing required option: o
usage: utility-name
-i,--input <arg> input file path
-o,--output <arg> output file
আরও সাম্প্রতিক জেকম্যান্ডারটি একবার দেখুন ।
আমি এটি তৈরি করেছি। আমি প্রশ্ন বা বৈশিষ্ট্য অনুরোধ পেয়ে খুশি।
আমি জাভা সি এল এল পার্সারগুলির একটি তালিকা বজায় রাখার চেষ্টা করছি ।
2020, কমন্স সিএলআই এর চেয়ে আরও ভাল করার সময় ... :-)
আপনার নিজের জাভা কমান্ড লাইন পার্সার তৈরি করা উচিত, বা একটি লাইব্রেরি ব্যবহার করা উচিত?
অনেকগুলি ছোট ছোট ইউটিলিটি-এর মতো অ্যাপ্লিকেশন সম্ভবত অতিরিক্ত বাহ্যিক নির্ভরতা এড়াতে তাদের নিজস্ব কমান্ড লাইন পার্সিং করে। পিকোক্লি একটি আকর্ষণীয় বিকল্প হতে পারে।
পিকোক্লি একটি আধুনিক গ্রন্থাগার এবং সহজেই শক্তিশালী, ব্যবহারকারী-বান্ধব, গ্রেয়ালভিএম-সক্ষম কমান্ড লাইন অ্যাপ্লিকেশন তৈরির কাঠামো। এটি 1 উত্স ফাইলে থাকে তাই অ্যাপসগুলি নির্ভরতা যুক্ত এড়াতে উত্স হিসাবে এটি অন্তর্ভুক্ত করতে পারে।
এটি রঙ, স্বতঃপূরণ, সাবকম্যান্ড এবং আরও অনেক কিছু সমর্থন করে। জাভাতে লিখিত, গ্রোভি, কোটলিন, স্কালা ইত্যাদি থেকে ব্যবহারযোগ্য
বৈশিষ্ট্য:
<command> -xvfInputFile
পাশাপাশি <command> -x -v -f InputFile
)"1..*"
,"3..5"
ব্যবহারের সাহায্যের বার্তাটি টীকাগুলির সাথে কাস্টমাইজ করা সহজ (প্রোগ্রামিং ছাড়াই)। উদাহরণ স্বরূপ:
( উত্স )
কী কী সহায়তা সহায়তা বার্তাগুলি সম্ভব তা দেখানোর জন্য আমি আরও একটি স্ক্রিনশট যুক্ত করে প্রতিহত করতে পারিনি। ব্যবহারের সহায়তা হ'ল আপনার আবেদনের মুখ, তাই সৃজনশীল হোন এবং মজা করুন!
দাবি অস্বীকার: আমি পিকোকলি তৈরি করেছি। মতামত বা প্রশ্ন খুব স্বাগত।
আমি JOpt ব্যবহার করেছি এবং এটি বেশ কার্যকর খুঁজে পেয়েছি: http://jopt-simple.sourceforge.net/
প্রথম পৃষ্ঠাটি প্রায় 8 টি বিকল্প গ্রন্থাগারগুলির একটি তালিকাও সরবরাহ করে, সেগুলি পরীক্ষা করে দেখুন এবং আপনার প্রয়োজন অনুসারে সবচেয়ে বেশি পছন্দ করুন pick
কেউ ইদানীং আরগস 4 জে আমাকে ইঙ্গিত করেছেন যা টীকা ভিত্তিক। আমি সত্যিই এটা পছন্দ করি!
এটি Google এর কমান্ড লাইনটি বাজেল প্রকল্পের অংশ হিসাবে লাইব্রেরি ওপেন সোর্সাকে পার্সিং করছে। ব্যক্তিগতভাবে আমি মনে করি এটি সেখানকার সেরা এবং আপাচি সি এল এলির চেয়ে অনেক সহজ।
https://github.com/pcj/google-options
maven_jar(
name = "com_github_pcj_google_options",
artifact = "com.github.pcj:google-options:jar:1.0.0",
sha1 = "85d54fe6771e5ff0d54827b0a3315c3e12fdd0c7",
)
dependencies {
compile 'com.github.pcj:google-options:1.0.0'
}
<dependency>
<groupId>com.github.pcj</groupId>
<artifactId>google-options</artifactId>
<version>1.0.0</version>
</dependency>
OptionsBase
আপনার @Option
(গুলি) প্রসারিত এবং সংজ্ঞায়িত করে এমন একটি শ্রেণী তৈরি করুন ।
package example;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;
import java.util.List;
/**
* Command-line options definition for example server.
*/
public class ServerOptions extends OptionsBase {
@Option(
name = "help",
abbrev = 'h',
help = "Prints usage info.",
defaultValue = "true"
)
public boolean help;
@Option(
name = "host",
abbrev = 'o',
help = "The server host.",
category = "startup",
defaultValue = ""
)
public String host;
@Option(
name = "port",
abbrev = 'p',
help = "The server port.",
category = "startup",
defaultValue = "8080"
)
public int port;
@Option(
name = "dir",
abbrev = 'd',
help = "Name of directory to serve static files.",
category = "startup",
allowMultiple = true,
defaultValue = ""
)
public List<String> dirs;
}
যুক্তিগুলি পার্স করুন এবং সেগুলি ব্যবহার করুন।
package example;
import com.google.devtools.common.options.OptionsParser;
import java.util.Collections;
public class Server {
public static void main(String[] args) {
OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class);
parser.parseAndExitUponError(args);
ServerOptions options = parser.getOptions(ServerOptions.class);
if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) {
printUsage(parser);
return;
}
System.out.format("Starting server at %s:%d...\n", options.host, options.port);
for (String dirname : options.dirs) {
System.out.format("\\--> Serving static files at <%s>\n", dirname);
}
}
private static void printUsage(OptionsParser parser) {
System.out.println("Usage: java -jar server.jar OPTIONS");
System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(),
OptionsParser.HelpVerbosity.LONG));
}
}
myexecutable -c file.json -d 42 --outdir ./out
। এবং আমি দেখতে পাচ্ছি না আপনি কীভাবে সংক্ষিপ্ত / দীর্ঘ / বর্ণনার বিকল্পগুলি সংজ্ঞায়িত করেন ... চিয়ার্স
কটাক্ষপাত কমন্স CLI সেখানে প্রকল্প, ভাল জিনিস প্রচুর।
Yeap।
আমি মনে করি আপনি এর মতো কিছু খুঁজছেন: http://commons.apache.org/cli
অ্যাপাচি কমন্স সি এল এল লাইব্রেরি কমান্ড লাইন ইন্টারফেস প্রসেসিংয়ের জন্য একটি এপিআই সরবরাহ করে।
আমি জানি যে এখানে বেশিরভাগ লোকেরা কেন আমার পথকে অপছন্দ করে তার 10 মিলিয়ন কারণ সন্ধান করতে যাচ্ছেন, তবে কিছু নয়। আমি জিনিসগুলি সহজ রাখতে পছন্দ করি, তাই আমি '=' ব্যবহার করে মানটি থেকে কীটি আলাদা করে এটিকে একটি হ্যাশম্যাপে সঞ্চয় করি:
Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);
}
আপনি যে আর্গুমেন্টটি প্রত্যাশা করছেন তার সাথে আপনি সর্বদা একটি তালিকা বজায় রাখতে পারেন, যদি ব্যবহারকারী কোনও যুক্তি ভুলে যায় বা কোনও ভুল ব্যবহার করে থাকে তবে ... আপনি যদি খুব বেশি বৈশিষ্ট্য চান তবে এই সমাধানটি আপনার পক্ষে যেমন না হয় তবে।
এগুলি হতে পারে
JArgs কমান্ড লাইন বিকল্প জাভা জন্য পার্সিং স্যুট - এই ক্ষুদ্র প্রকল্পটি জাভা প্রোগ্রামার ব্যবহারের জন্য কমান্ড লাইন বিকল্প পার্সারগুলির একটি সুবিধাজনক, কমপ্যাক্ট, প্রাক-প্যাকেজড এবং বিস্তৃতভাবে ডকুমেন্টেড স্যুট সরবরাহ করে। প্রাথমিকভাবে, জিএনইউ-স্টাইল 'গেটোপ্ট' এর সাথে সামঞ্জস্যপূর্ণ পার্সিং সরবরাহ করা হয়।
রিটোপট, জাভার জন্য আলটিমেট অপশন পার্সার - যদিও, বেশ কয়েকটি কমান্ড লাইন বিকল্পের মান প্রস্তুত করা হয়েছে, রিটোপট অপ্ট প্যাকেজে নির্ধারিত কনভেনশনগুলি অনুসরণ করে।
আপনি অসুখের এই মেটা-নিবন্ধটি জাম্পিং পয়েন্ট হিসাবে আকর্ষণীয় বলে মনে করতে পারেন:
http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html
আমি আর একটি লিখেছি: http://argparse4j.sourceforge.net/
আরগপারস ৪ জে পাইথনের আরগপার্সের ভিত্তিতে জাভা জন্য একটি কমান্ড লাইন আর্গুমেন্ট পার্সার গ্রন্থাগার।
আপনি যদি gnu getopt এর সাথে পরিচিত হন তবে এখানে একটি জাভা বন্দর রয়েছে: http://www.urbanophile.com/arenn/hacking/download.htm ।
কিছু শ্রেণি উপস্থিত রয়েছে যা এটি করে:
এয়ারলাইনস @ গিথুব ভাল দেখাচ্ছে এটি টীকাগুলির উপর ভিত্তি করে এবং গিট কমান্ড লাইন কাঠামো অনুকরণ করার চেষ্টা করছে।
আপনি যদি ইতিমধ্যে স্প্রিং বুট ব্যবহার করে থাকেন তবে বাক্স থেকে আর্গুমেন্ট পার্সিংয়ের বিষয়টি আসে।
আপনি যদি শুরুর পরে কিছু চালাতে চান তবে ApplicationRunner
ইন্টারফেসটি প্রয়োগ করুন :
@SpringBootApplication
public class Application implements ApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(ApplicationArguments args) {
args.containsOption("my-flag-option"); // test if --my-flag-option was set
args.getOptionValues("my-option"); // returns values of --my-option=value1 --my-option=value2
args.getOptionNames(); // returns a list of all available options
// do something with your args
}
}
run
প্রসঙ্গটি সফলভাবে শুরু হওয়ার পরে আপনার পদ্ধতিটি চাওয়া হবে।
আপনি যদি নিজের অ্যাপ্লিকেশন প্রসঙ্গে আগুন জ্বালানোর আগে আপনার যুক্তিগুলির অ্যাক্সেসের প্রয়োজন হয় তবে আপনি কেবল অ্যাপ্লিকেশন যুক্তিগুলি ম্যানুয়ালি পার্স করতে পারেন:
@SpringBootApplication
public class Application implements ApplicationRunner {
public static void main(String[] args) {
ApplicationArguments arguments = new DefaultApplicationArguments(args);
// do whatever you like with your arguments
// see above ...
SpringApplication.run(Application.class, args);
}
}
এবং অবশেষে, আপনার যদি বিনের মধ্যে আপনার যুক্তিগুলির অ্যাক্সেসের প্রয়োজন হয় তবে কেবল ইনজেক্ট করুন ApplicationArguments
:
@Component
public class MyBean {
@Autowired
private ApplicationArguments arguments;
// ...
}
আরগপারস 4 জে আমি সবচেয়ে ভাল খুঁজে পেয়েছি। এটি পাইথনের আরগপার্স লিবারি নকল করে যা খুব সুবিধাজনক এবং শক্তিশালী।
আপনি যদি কিছু হালকা ওজনের (জারের আকার ~ 20 কেবি) এবং সহজে ব্যবহার করতে চান তবে আপনি যুক্তি-পার্সার চেষ্টা করতে পারেন । এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে ব্যবহার করা যেতে পারে, যুক্তিতে অ্যারে নির্দিষ্ট করে সমর্থন করে এবং অন্য কোনও লাইব্রেরির উপর নির্ভরতা রাখে না। এটি জাভা 1.5 বা তার উপরে জন্য কাজ করে। নীচের অংশে এটি কীভাবে ব্যবহার করতে হবে তার একটি উদাহরণ দেখায়:
public static void main(String[] args) {
String usage = "--day|-d day --mon|-m month [--year|-y year][--dir|-ds directoriesToSearch]";
ArgumentParser argParser = new ArgumentParser(usage, InputData.class);
InputData inputData = (InputData) argParser.parse(args);
showData(inputData);
new StatsGenerator().generateStats(inputData);
}
আমি ব্যবহারের সুপারিশ করব না Apache Common CLI
লাইব্রেরিটি , কারণ এটি থ্রেডএসেফ নয়।
এটি অভ্যন্তরীণ কাজ (যেমন OptionBuilder
) করার জন্য স্ট্যাটিক ভেরিয়েবল এবং পদ্ধতিগুলির সাথে রাষ্ট্রীয় ক্লাস ব্যবহার করে এবং কেবল একক থ্রেডযুক্ত দৃ strongly়ভাবে নিয়ন্ত্রিত পরিস্থিতিতে ব্যবহার করা উচিত।
পূর্বে উল্লিখিত মতামতের মধ্যে একটি হিসাবে ( https://github.com/pcj/google-options ) শুরু করা ভাল পছন্দ হবে।
আমি যুক্ত করতে চাই একটি জিনিস:
1) আপনি যদি কিছু পার্সার প্রতিবিম্ব ত্রুটিতে চলে যান তবে অনুগ্রহ করে পেয়ারার আরও একটি নতুন সংস্করণ ব্যবহার করার চেষ্টা করুন। আমার ক্ষেত্রে:
maven_jar(
name = "com_google_guava_guava",
artifact = "com.google.guava:guava:19.0",
server = "maven2_server",
)
maven_jar(
name = "com_github_pcj_google_options",
artifact = "com.github.pcj:google-options:jar:1.0.0",
server = "maven2_server",
)
maven_server(
name = "maven2_server",
url = "http://central.maven.org/maven2/",
)
2) কমান্ডলাইন চালানোর সময়:
bazel run path/to/your:project -- --var1 something --var2 something -v something
3) আপনার যখন সহায়তা সহায়তা প্রয়োজন তখন কেবল টাইপ করুন:
bazel run path/to/your:project -- --help
স্প্রিং ব্যবহারকারীদের জন্য আমাদের https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/SimpleCommandLinePropertySource.html এবং তার যমজ ভাই https: //docs.spring উল্লেখ করা উচিত .io / বসন্ত / ডকস / বর্তমান / জাভাদোক-এপি / org / বসন্ত ফ্রেমওয়ার্ক / কোর / এনভি / JOptCommandLinePropertySource.html (একই কার্যকারিতা JOpt বাস্তবায়ন)। স্প্রিংয়ের সুবিধাটি হ'ল আপনি সরাসরি কমান্ড লাইন যুক্তিগুলিকে গুণাবলীতে আবদ্ধ করতে পারেন, এখানে একটি উদাহরণ রয়েছে https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/ CommandLinePropertySource.html