2009-11-06 2 views
4

У меня есть приложение Java, из которого я вызываю скрипт оболочки. Может ли кто-нибудь сказать, где сохранить файл сценария в моем приложении и каков путь доступа к файлу в целом приложении.расположение сценария оболочки, вызванного из java-приложения

im, сохраняющий мой скрипт в пакете java, но когда я пытаюсь получить доступ, используя путь, например com.abc.script.sh, запустив приложение java через unix i ma, получив ошибку java.io.IOException: error = 2, нет такого файла или каталога

я звоню файл сценария с некоторым аргументом со следующим кодом

частных статических окончательный командной строки = «com.abc.script.sh -db абв -scm TEST_xyz -bcp ком. abc.out.txt -log/var/tmp -tab abc_ $ TABLENAME ";

Process process = Runtime.getRuntime(). Exec (команда);

и я запускаю приложение из unix.

Мне также нужно передать параметр в файл сценария оболочки. параметры похожи на имя хоста, имя таблицы ...

ответ

0

Вы можете сохранить сценарий оболочки как ресурс (например, внутри вашего файла jar), а затем выполнить оболочку и передать содержимое вашего сценария в качестве стандартного ввода в текущую оболочку ,

Что-то вроде этого (не пробовал):

ProcessBuilder processBuilder = new ProcessBuilder("/usr/bin/bash"); 
Process process = processBuilder.start(); 
OutputStream outputStream = process.getOutputStream(); 
InputStream resourceStream = getClass().getResourceAsStream( 
     "/path/to/my/script.sh"); 
IOUtils.copy(resourceStream, outputStream); 
+0

Правильный ответ. Конечно, с небольшими примерами кода было бы еще лучше :) – Jonik

+0

Хорошо, я добавил код ... – tangens

+0

Где я могу найти класс IOUtils? –

3

где сохранить файл сценария в моем приложении

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

  • Сохранение содержимого файла в памяти
  • Сохранение файла в вашем файле .jar

Я думаю, вы имеете в виду второе.

Вы можете поместить его в свой файл jar в каждую нужную папку. Я предпочитаю подпапку (а не корень)

Сначала положите файл в свою банку. Затем вы должны извлечь его на temporary file (см. Ссылку, если вы хотите узнать, как создать временный файл).
Затем создайте входной поток из файла в банке и скопируйте данные в файл temp.

InputStream is = getClass().getResourceAsStream("/path/script.sh"); 
OutputStream os = new FileOutputStream(tempFile); 
byte[] buffer = new byte[1024]; 
int bytesRead; 
while ((bytesRead = is.read(buffer)) != -1) 
{ 
    os.write(buffer, 0, bytesRead); 
} 
buffer = null; // Clear the buffer 

Затем вы должны выполнить ваш shellscript

Runtime.getRuntime().exec("terminalname " + tempFile.getAbsolutePath()); 

Может быть, вы можете использовать эту линию, чтобы выполнить сценарий (я не думаю, что это будет работать с вашими параметрами):

java.awt.Desktop.getDestkop().open(tempFile); 

Надеюсь, это ответ на ваш вопрос.

0

Если вы используете платформу Spring для этого проекта, хорошим и простым вариантом является сохранение сценария оболочки в папке на пути к вашему классу и использование объекта ClassPathResource для его поиска.

Смежные вопросы