从java应用程序调用的shell脚本的位置

时间:2009-11-06 15:56:56

标签: java shell

我有一个java应用程序,我从中调用一个shell脚本。任何人都可以告诉我在我的应用程序中保存脚本文件的位置以及在整个应用程序中访问该文件的路径。

我将我的脚本保存在java包中,但当我尝试使用com.abc.script.sh这样的路径通过unix运行我的java应用程序时获取错误  java.io.IOException:error = 2,没有这样的文件或目录

我使用以下代码

调用脚本文件

private static final String command =“com.abc.script.sh -db abc -scm TEST_xyz -bcp com.abc.out.txt -log / var / tmp -tab abc_ $ TABLENAME”;

Process process = Runtime.getRuntime()。exec(command);

我正在从unix运行该应用程序。

我也需要将参数传递给shell脚本文件。参数类似于主机名,表名......

3 个答案:

答案 0 :(得分:3)

  

将脚本文件保存在我的应用程序中的位置

你写道,我可以解释这个:

  • 将文件内容存储到内存
  • 将文件存储到.jar文件

我认为你的意思是第二个。

您可以将它放在您想要的每个文件夹中的jar文件中。我更喜欢子文件夹(不是根目录)

首先将文件放入jar中。然后你必须将它提取到temporary file(如果你想知道如何制作临时文件,请参阅链接)。
然后从jar文件中创建一个输入流,并将数据复制到临时文件中。

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

然后你必须执行你的shellcript

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

也许您可以使用此行来执行您的脚本(我认为这不适用于您的参数):

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

我希望这是你问题的答案。

答案 1 :(得分:0)

您可以将shell脚本存储为资源(例如,在jar文件中),然后执行shell并将脚本内容作为标准输入传递给正在运行的shell。

像这样的东西(还没试过):

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 );

答案 2 :(得分:0)

如果你恰好在这个项目中使用Spring框架,一个好的简单选择是将shell脚本存储在类路径的文件夹中,并使用ClassPathResource对象来定位它。