автоматически выполнять программу с аргументами

Я создаю инструмент, который должен конвертировать из формата A в формат B через командную строку Windows. Я запрограммировал что-то вроде интерактивного режима. cmd ожидает ввода команд и обрабатывает их. Теперь я хотел передать некоторые аргументы, если вызову программу. Аргументы будут переданы, но программа не будет выполнять команды сама по себе.

Я передаю такие аргументы:

java -jar test.jar -interactive //activates the interactive mode, which does not make any problems

и так (передача исходного файла, целевого места для сохранения преобразованного файла, целевого формата и, наконец, файла конфигурации, используемого во время преобразования):

java -jar test.jar C:\Users\User\Desktop\test.json C:\Users\User\Desktop .xes C:\Users\User\Desktop\test.properties

код пока:

public static void main(final String[] args) throws IOException, InterruptedException {

    if (args[0].equals("-interactive")) {
        testing test = new testing();
        test.startCMD();
    } else if (args[0] != null && args[1] != null && args[2] != null && args[3] != null) {
        final testing test = new testing();
        test.startCMD();
        //the following construct doesn't work unfortunatelly
        worker = Executors.newSingleThreadScheduledExecutor();
        Runnable task = new Runnable() {

            @Override
            public void run() {
                    test.setSourceFile(args[0]);
                    test.setTargetPath(args[1]);
                    test.setTargetFormat(args[2]);
                    test.setConfigFilePath(args[3]);
                    System.out.println("Invoking the conversion routine now ...");
                    ConverterControl control = new ConverterControl();
                    control.link(sourceFilePath, targetPath, configFilePath, targetFormat, fileConfig);
            }

        };
        worker.schedule(task, 5, TimeUnit.SECONDS);
    }
}

public void startCMD() throws IOException, InterruptedException {
    String[] command
            = {
                "cmd",};
    Process p = Runtime.getRuntime().exec(command);
    new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
    new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
    BufferedReader in = new BufferedReader(
            new InputStreamReader(System.in));
    System.out.println("Welcome to the Windows command line prompt." + System.lineSeparator());
    System.out.println("Please type \"help\" to receive a list of commands available in this environment.");
    //String s = in.readLine();
    String input;
    while ((input = in.readLine()) != null) {
        //process the inputs
}

Различные setter, которые вы видите в основном методе, просто устанавливают переданную информацию в переменную, которая объявлена ​​в верхней части класса. А потом эти переменные должны быть переданы в ConverterControl, у которого в методе link() есть вся процедура преобразования. Программа останавливается, если я передаю 4 аргумента (см. второй вызов программы вверху) после выполнения команды startCMD().

Кто-нибудь знает, как вызвать эти методы и запустить ConverterControl автоматически?


person X-Fate    schedule 15.01.2015    source источник


Ответы (2)


Вероятно, вы застряли в цикле while в конце startCmd(), и ваша программа никогда не продолжится дальше.

person Andi    schedule 15.01.2015

Почему вы вызываете startCMD(), если вы получили аргументы командной строки?

Кроме того, похоже, что вы также можете немного неправильно использовать статические переменные.

Чтобы привести это в порядок, ваш «тестирующий» класс должен реализовывать Runnable, и вы должны передать ссылку на свой «тестовый» объект в свой рабочий процесс.

if (args[0].equals("-interactive")) {
    testing test = new testing();
    test.startCMD();
} else if (args[0] != null && args[1] != null && args[2] != null && args[3] != null) {
                final testing test = new testing();
        test.startCMD();//Why is this call here?

        test.setSourceFile(args[0]);
        test.setTargetPath(args[1]);
        test.setTargetFormat(args[2]);
        test.setConfigFilePath(args[3]);

        worker = Executors.newSingleThreadScheduledExecutor();
        worker.schedule(test, 5, TimeUnit.SECONDS);
}

Остальная часть метода run() будет просто перемещена в метод run() в вашем «тестирующем» классе.

@Override
        public void run() {
                ConverterControl control = new ConverterControl();
                control.link(sourceFilePath, targetPath, configFilePath, targetFormat, fileConfig);
        }
person C Hudson    schedule 15.01.2015