【问题标题】:location of shell script called from java application从 java 应用程序调用的 shell 脚本的位置
【发布时间】:2009-11-06 15:56:56
【问题描述】:

我有一个 java 应用程序,我从中调用一个 shell 脚本。谁能告诉我在我的应用程序中将脚本文件保存在哪里以及在整个应用程序中访问该文件的路径是什么。

我将我的脚本保存在 java 包中,但是当我尝试通过 unix 运行我的 java 应用程序来使用 com.abc.script.sh 之类的路径访问时,我遇到了错误 java.io.IOException: error=2, No such file or directory

我正在使用以下代码调用带有一些参数的脚本文件

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

进程进程 = Runtime.getRuntime().exec(command);

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

我还需要将参数传递给 shell 脚本文件。参数如主机名、表名...

【问题讨论】:

    标签: java shell


    【解决方案1】:

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

    你写的,我可以这样解释:

    • 将文件内容存入内存
    • 将文件存储到您的 .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
    

    然后你必须执行你的shellscript

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以将您的 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 );
      

      【讨论】:

      • 正确答案。当然,如果代码示例很少,那就更好了:)
      • 在哪里可以找到 IOUtils 类?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        相关资源
        最近更新 更多