Некоторая информация о том, как обрабатывать аргументы main() в Java [дубликаты]

Мне нужно разработать Java-приложение командной строки, в котором метод main() принимает 2 параметра String с именами соответственно partitaIVA и 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];
    }
}

Итак, теперь у меня есть 2 сомнения по поводу этой темы:

1) Я знаю, что могу выполнить это приложение, указав 2 параметра, используя командную строку Windows или оболочку Linux, но могу ли я сделать то же самое в своей консоли IDE? В частности, на вкладке Выполнить в IntelliJ?

2) Можно ли как-то указать, что параметров, которые может указать пользователь, всего 2?


person AndreaNobili    schedule 10.02.2015    source источник
comment
Должна быть такая настройка, как Run Configurations (так она называется в Eclipse), где вы можете передавать аргументы командной строки. Ищите, может быть, Run.... Нет, нет никакого способа ограничить количество пользователей, передающих два, но вы можете спокойно игнорировать оставшиеся аргументы, выдавать ошибку или обрабатывать ее как хотите.   -  person Kon    schedule 10.02.2015


Ответы (3)


В Intellij (Linux) вы делаете:

Нажмите Alt + Shift + F10 (ярлык запуска)

Нажмите правую клавишу

Перейти к редактированию

Затем нажмите Tab, чтобы перейти к «Аргументам программы».

Здесь вы передаете аргументы в IntelliJ. После этого просто нажмите бег.

person Brunaldo    schedule 10.02.2015

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) Нет, можно только распечатать ошибку и направить пользователя

person Leander    schedule 10.02.2015

Вам следует потратить время на изучение современного парсера аргументов 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();
}

}

person Community    schedule 10.02.2015