Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск bat файла с аргументами 
:(
    Опции темы
garbuz
Дата 12.1.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Запускаю из приложения бат файл
Код

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


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

ЗЫ. По форуму искал, возможно плохо smile - не нашел.
PM MAIL   Вверх
Temdegon
Дата 12.1.2009, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



В командный файл вроди бы параметры передаются обычно через пробел: "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!

Это сообщение отредактировал(а) Temdegon - 12.1.2009, 02:09
PM MAIL   Вверх
javaman
Дата 12.1.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



Там же есть еще один метод exec с массивом String[].  Первым элементом массива будет комманда, а далее идут её аргументы.

Это сообщение отредактировал(а) javaman - 12.1.2009, 07:47
PM MAIL   Вверх
MisterCleric
Дата 12.1.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



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


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
garbuz
Дата 12.1.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Всем спасибо, позже попробую различные варианты smile

MisterCleric, не, пока джара для запуска нет smile Возможно будет позже. А так как запускать? Не напишешь? smile
PM MAIL   Вверх
MisterCleric
Дата 12.1.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



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


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
LSD
Дата 12.1.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
garbuz
Дата 16.2.2009, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Цитата

Подключаешь этот 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 Может надо как-то по-другому подсунуть джарники нужные томкату?!


Это сообщение отредактировал(а) garbuz - 16.2.2009, 12:54
PM MAIL   Вверх
ivg
Дата 16.2.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



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

Какого приложения? Tomcat'а? А куда именно?
PM MAIL   Вверх
garbuz
Дата 16.2.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Кажется тут нужен отдельный класслоадер... я прав? или же можно без него обойтись?

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

Добавлено через 5 минут и 37 секунд
Итак, еще раз. 
Есть веб приложение, крутится на томкате. Из него мне надо вызвать другое приложение, которое лежит в файловой системе, при этом передать ему массив с параметрами. Второе приложение, что что мне надо запустить, состоит из нескольких джар файлов, которые используют друг друга в процессе работы. Так вот. Делал сперва это через бат файл, потом прочитал что этоизврат запускать джаву из джавы через батник. Решил вызывать напрямую, благо появился джар файл, который можно "запустить". Сейчас эти джарники добавил в класспас моего приложения через IDE, ну т.е. просто в либы добавил, на сервер они не деплоятся, естественно их серверу не найти... Короче вот так. Как лучше поступить? 
PM MAIL   Вверх
ivg
Дата 16.2.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



У этого второго приложения 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'а их найдут?
PM MAIL   Вверх
garbuz
Дата 17.2.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Цитата(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 томката, все равно что-то не хочет.
PM MAIL   Вверх
ivg
Дата 17.2.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(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 томката, все равно что-то не хочет. 

Каждый раз видимо по разному "не хочет". Надо при каждой ошибке анализировать стек-трейс и устранять.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1252 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.