Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Запуск bat файла с аргументами


Автор: garbuz 12.1.2009, 00:10
Запускаю из приложения бат файл
Код

String message = "Hello Vingrad!"; 
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("C:/run.bat");


Бат файл запускает другое java-приложение, которому нужно в качестве аргумента передать строку message. Как?

ЗЫ. По форуму искал, возможно плохо smile - не нашел.

Автор: Temdegon 12.1.2009, 01:58
В командный файл вроди бы параметры передаются обычно через пробел: "myBat.bat param1 param2"
И принимаются в %номер_параметра в самом файле

Код

String message = "Hello Vingrad!"; 
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("C:/run.bat " + message);

а в фале этот параметр будет переменной %1, если я не ошибаюсь


===
Хотя, нифига, наверное получится два параметра, т.к. в строке есть пробел. может прокатит строку в кавычки или в апострафы взять, чтоб она в один параметр попала
===
Проверил, что бы не разбивалась по пробелам надо в двойные кавычки заключить переменную:
Process proc = rt.exec("C:/run.bat" + " \"" + message + "\"");

тогда бат-файл 
Код

echo %1

выведет Hello Vingrad!

Автор: javaman 12.1.2009, 07:45
Там же есть еще один метод http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runtime.html#exec(java.lang.String%5B%5D) с массивом String[].  Первым элементом массива будет комманда, а далее идут её аргументы.

Автор: MisterCleric 12.1.2009, 10:36
а почему нельзя напрямую вызвать то java-приложение? Наверняка это jar, а в нем есть main-class, который и принимает эти параметры.
А то у тебя под виндой-то будет работать bat, а под остальными осями...

Автор: garbuz 12.1.2009, 10:42
Всем спасибо, позже попробую различные варианты smile

MisterCleric, не, пока джара для запуска нет smile Возможно будет позже. А так как запускать? Не напишешь? smile

Автор: MisterCleric 12.1.2009, 10:50
Подключаешь этот jar в classpath своего приложения. Находишь в его манифесте директиву Main-Class.
Создаешь его инстанс вызываешь метод main этого объекта этого класса со своими параметрами.
Можно, например еще этот вызов обернуть в отдельный поток да еще с атрибутом setDaemon(true) и вообще закрыть свое приложение

Автор: LSD 12.1.2009, 22:46
Runtime.exec() запускает только приложения, а не текстовые файлы.

Для того чтобы выполнить команды которые прописаны в bat файле, надо запустить интерпретатор командных файлов (cmd.exe). И передать ему в качестве параметра имя командного файла который надо выполнить.

Автор: garbuz 16.2.2009, 03:43
Цитата

Подключаешь этот jar в classpath своего приложения. Находишь в его манифесте директиву Main-Class.
Создаешь его инстанс вызываешь метод main этого объекта этого класса со своими параметрами.

Возвращаюсь к старой теме smile 
Появился jar файл, теперь отпала необходимость использовать промежуточный bat файл.
Пытаюсь запустить второе приложение из первого, запуск происходит в сервлете в новом потоке, все jar файлы второго приложения добавил в classpath 1-ого приложения через IDE (идея)
Код

String[] sa = {"p1", "p2", "file:/d:/test/", fileUrl.toString()};
Launcher.main(sa);

В итоге
Код

java.lang.NoClassDefFoundError: ru/test/Launcher
    at ru.client.UploadDownloadServlet$1.run(UploadDownloadServlet.java:150)
Caused by: java.lang.ClassNotFoundException: ru.test.Launcher
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1360)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1206)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    ... 1 more

Судя по стектрейсу эксепшен кидается где-то на стороне томката, только вот непонятно как это бороть... Джарники-то я добавил в classpath приложения, Импорты сделал, все вроде нормально... smile Может надо как-то по-другому подсунуть джарники нужные томкату?!

Автор: ivg 16.2.2009, 23:27
garbuz, лучше первоначальную постановку задачи укажите. Почему это приложение надо запускать таким образом? Почему не использовать его как библиотеку?
Цитата(garbuz @  16.2.2009,  05:43 Найти цитируемый пост)
Джарники-то я добавил в classpath приложения

Какого приложения? Tomcat'а? А куда именно?

Автор: garbuz 16.2.2009, 23:27
Кажется тут нужен отдельный класслоадер... я прав? или же можно без него обойтись?

Еще раз скажу, что из веб приложения вызываю приложение, которое разнесено по нескольким джарам, лежащими в файловой системе. Второму приложению нужно передать массив с параметрами. Добавление этих джаров в classpath приложения (добавляю через IDE) не помогает smile

Добавлено через 5 минут и 37 секунд
Итак, еще раз. 
Есть веб приложение, крутится на томкате. Из него мне надо вызвать другое приложение, которое лежит в файловой системе, при этом передать ему массив с параметрами. Второе приложение, что что мне надо запустить, состоит из нескольких джар файлов, которые используют друг друга в процессе работы. Так вот. Делал сперва это через бат файл, потом прочитал что этоизврат запускать джаву из джавы через батник. Решил вызывать напрямую, благо появился джар файл, который можно "запустить". Сейчас эти джарники добавил в класспас моего приложения через IDE, ну т.е. просто в либы добавил, на сервер они не деплоятся, естественно их серверу не найти... Короче вот так. Как лучше поступить? 

Автор: ivg 16.2.2009, 23:55
У этого второго приложения JavaDoc или исходники есть?

Цитата(garbuz @  17.2.2009,  01:27 Найти цитируемый пост)
надо вызвать другое приложение, которое лежит в файловой системе, при этом передать ему массив с параметрами

Я не пойму, почему нельзя вызвать напрямую из вашего кода нужный функционал, точно так же как, ну например, для log4j, вы методы вызываете. Зачем вот это:
Цитата(garbuz @  16.2.2009,  05:43 Найти цитируемый пост)
Код

String[] sa = {"p1", "p2", "file:/d:/test/", fileUrl.toString()};
Launcher.main(sa);

Цитата(garbuz @  17.2.2009,  01:27 Найти цитируемый пост)
на сервер они не деплоятся, естественно их серверу не найти...

Почему нельзя сделать чтоб деплоились?
Или положить в папку, где загрузчики классов Tomcat'а их найдут?

Автор: garbuz 17.2.2009, 00:39
Цитата(ivg @  16.2.2009,  23:55 Найти цитируемый пост)
Я не пойму, почему нельзя вызвать напрямую из вашего кода нужный функционал, точно так же как, ну например, для log4j вы методы вызываете.

Теперь я не понимаю вас. :(
Цитата
 Зачем вот это:

Пытался вызвать метод main другого приложения, естественно ничего не получилось, потом попробовал через рефлекшн, тоже ничего не вышло.
Код

    
String[] sa = {"p1", "p2", "file:/d:/test/", fileUrl.toString()};
 String mainClass;
                ClassLoader contextClassLoader = null;

                try {
                    String jarName = "d:/test/test.jar";

                    
                    JarFile jarFile = new JarFile(jarName);
                    Attributes attrs = jarFile.getManifest().getMainAttributes();
                    mainClass = attrs.getValue("Main-Class");
                    URL[] urls = {new URL("file:/" + jarName)};
                    URLClassLoader cl = new URLClassLoader(urls);
                    contextClassLoader = Thread.currentThread().getContextClassLoader();
                    Thread.currentThread().setContextClassLoader(cl);
                    Class cMainClass = cl.loadClass(mainClass);
                    Method main = cMainClass.getMethod("main", new Class[]{String[].class});
                    main.invoke(cMainClass.newInstance(), new Object[]{sa});

                }
                catch (IOException e) {
                    e.printStackTrace();
                }...




Цитата(ivg @  16.2.2009,  23:55 Найти цитируемый пост)
Или положить в папку, где загрузчики классов Tomcat'а их найдут?

Попробовал и в либы приложения добавит в WEB-INF, и в папку lib томката, все равно что-то не хочет.

Автор: ivg 17.2.2009, 00:52
Цитата(garbuz @  17.2.2009,  02:39 Найти цитируемый пост)
Теперь я не понимаю вас. :(

Что делает метод main(). Разбирает командную строку, и в соответствии с этими параметрами выполняет какие-то действия. Зачем вам "кодировать" эти параметры:
Цитата(garbuz @  17.2.2009,  02:39 Найти цитируемый пост)
Код
String[] sa = {"p1", "p2", "file:/d:/test/", fileUrl.toString()};
 если вы можете напрямую из сервлета(или что там у вас) выполнить эти действия.
Цитата(garbuz @  17.2.2009,  02:39 Найти цитируемый пост)
Попробовал и в либы приложения добавит в WEB-INF, и в папку lib томката, все равно что-то не хочет. 

Каждый раз видимо по разному "не хочет". Надо при каждой ошибке анализировать стек-трейс и устранять.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)