我必须开发一个命令行Java应用程序,其中main()方法接受两个名为respetivelypartitaIVA和nomePDF的字符串参数。
因此,作为起点,我创建了这个简单的Main类:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World !!!");
}
}
我认为我可以从Windows控制台执行这个极简主义的应用程序,我可以在Windows控制台(或Linux外壳)中执行我的应用程序热情这些参数:
java Main 123456789 myDocument.pdf
我认为我可以在我的应用程序中检索它,以这种方式修改原始代码:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World !!!");
String partitaIVA = args[0];
String nomePDF = args[1];
}
}
所以现在我对这个话题有两个疑问:
1) 我知道我可以使用Windows命令行或Linux shell执行指定2个参数的应用程序,但我可以在IDE控制台中执行同样的操作吗?特别是在IntelliJ的运行选项卡中?
2) 我可以用某种方式指定用户可以指定的参数只有2吗?
1)有一种叫做运行/调试配置的东西https://www.jetbrains.com/idea/help/creating-and-editing-run-debug-configurations.html(这里还有一些关于您所拥有的具体选项的详细信息:https://www.jetbrains.com/idea/help/creating-and-editing-run-debug-configurations.html#d1628194e152)
2) 不可以,您只能打印错误并引导用户
您应该投入时间学习现代CLI参数解析器:
我更喜欢JewelCli
<dependency>
<groupId>com.lexicalscope.jewelcli</groupId>
<artifactId>jewelcli</artifactId>
<version>0.8.9</version>
</dependency>
下面是一个可以用作基类的示例:
public class Main
{
private static final Logger LOG;
static
{
LOG = LoggerFactory.getLogger(Main.class);
}
private static Args init(@Nonnull final String[] args)
{
final Cli<Args> cli = CliFactory.createCli(Args.class);
try
{
return cli.parseArguments(args);
}
catch (final ArgumentValidationException e)
{
for (final ValidationFailure vf : e.getValidationFailures())
{
LOG.error(vf.getMessage());
}
LOG.info(cli.getHelpMessage());
System.exit(2); // Bash standard for arg parsing errors
return null; // This is to make the compiler happy!
}
}
private static List<String> parseKey(@Nonnull final String key)
{
return new ArrayList<String>(Arrays.asList(key.toLowerCase().split("\.")));
}
@SuppressWarnings("unchecked")
private static Map<String, Object> addNode(@Nonnull Map<String, Object> node, @Nonnull final List<String> keys, @Nonnull final String value)
{
if (keys.isEmpty())
{
return node;
}
else if (keys.size() == 1)
{
node.put(keys.remove(0), value.trim());
return node;
}
else if (node.containsKey(keys.get(0)))
{
return addNode((Map<String, Object>) node.get(keys.remove(0)), keys, value);
}
else
{
final Map<String, Object> map = new HashMap<String, Object>();
node.put(keys.remove(0), map);
return addNode(map, keys, value);
}
}
public static void main(final String[] args)
{
try
{
final Args a = init(args);
final Properties p = new Properties();
p.load(new FileInputStream(a.getInputFile()));
final HashMap<String, Object> root = new HashMap<String, Object>();
for (final String key : p.stringPropertyNames())
{
addNode(root, parseKey(key), p.getProperty(key));
}
switch (a.getFormat().toLowerCase().charAt(0))
{
case 'j': LOG.info(mapToJson(root)); break;
case 'b' : LOG.info(Strings.bytesToHex(mapToCbor(root))); break;
case 'x' : LOG.error("XML not implemented at this time!"); break;
default : LOG.error("Invalid format {}", a.getFormat());
}
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
interface Args
{
@Option(shortName = "i", longName = "input", description = "Properties file to read from.")
File getInputFile();
@Option(shortName = "o", longName = "output", description = "JSON file to output to.")
File getOutputFile();
@Option(shortName = "f", longName = "format", description = "Format of output Json|Binary|Xml")
String getFormat();
@Option(helpRequest = true, description = "Display Help", shortName = "h")
boolean getHelp();
}
}
在Intellij(Linux)中,您可以执行:
按Alt+Shift+F10(运行快捷键)
按下右键
向下进入编辑
然后按Tab键进入"程序参数"。
这是您在IntelliJ中传递碎片的地方。在那之后,我就跑了。