【问题标题】:Running shell commands within .java file using ProcessBuilder使用 ProcessBuilder 在 .java 文件中运行 shell 命令
【发布时间】:2018-05-01 23:25:15
【问题描述】:

我遇到了一个讨厌的小错误,我不知道如何解决它。我要做的很简单:使用 ProcessBuilder 运行一个外部 .java 文件。就像那个标题所暗示的那样。

问题是运行和创建此 ProcessBuilder 的文件与我要运行的其他文件位于不同的目录中。

我想要解决的问题是:

String command[] = {"javac",JAVA_FILE_LOCATION};
ProcessBuilder processBuilder = new ProcessBuilder("cd");
Process process0 = processBuilder.start();

重置目录和

processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();

编译另一个文件

if( process.getErrorStream().read() != -1 ){
    print("Compilation Errors",process.getErrorStream());
}

这里只是一些错误处理。但是它并没有通过这个错误句柄部分。我无法弄清楚这样做的正确方法。这是错误消息:

my_PC:Processes user$ java -jar process.jar
************* Compilation Errors***********************
avac: file not found: /Users/Desktop/Piano.java
Usage: javac <options> <source files>
use -help for a list of possible options
Exception in thread "main" java.lang.IllegalThreadStateException: process hasn't exited
at java.lang.UNIXProcess.exitValue(UNIXProcess.java:423)
at my.package.address.Main.main(Main.java:28)

有谁知道我做错了什么?如果需要,我也可以发布整个代码,但我认为它在这里并不真正相关。

更新:添加了我的代码

package some.random.package;

import java.io.*;

public class Main {
/**
* Provide absolute JAVA file path
*/
private static final String JAVA_FILE_LOCATION = "/Users/Desktop/piano.java";

    public static void main(String args[]) throws IOException
    {
        String command[] = {"javac",JAVA_FILE_LOCATION};
        ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File("/Users/Desktop/"));
        Process process = processBuilder.start();
        if( process.getErrorStream().read() != -1 ){
            print("Compilation Errors",process.getErrorStream());
        }
        /**
        * check if compile is successful
        * 0 => successful
        */
        if( process.exitValue() == 0 )
        {
            process = new ProcessBuilder(new String[]{"java","piano"}).directory(new File("/Users/Desktop/")).start();
            if( process.getErrorStream().read() != -1 )
                print("Errors ",process.getErrorStream());
            else
                print("Output ",process.getInputStream());

            /**
            * Check if RuntimeException or Errors encounter during execution then print errors on console
            * Otherwise print Output
            */
        }
    }
    private static void print(String status,InputStream input) throws IOException
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(input));
        System.out.println("************* "+status+"***********************");
        String line = null;
        while((line = in.readLine()) != null ){
        System.out.println(line);
      }
    in.close();
    }
}

【问题讨论】:

    标签: java shell processbuilder


    【解决方案1】:

    你用第一个ProcessBuilder 执行的cd 命令只影响那个子进程,它不会改变主执行程序的工作目录。 当您运行第二个ProcessBuilder 时,它会将工作目录作为主程序, 完全不受前一个ProcessBuilder执行的cd的影响。

    要从不同目录执行程序,请使用ProcessBuilderdirectory(...) 方法:

    String command[] = {"javac", JAVA_FILE_LOCATION};
    ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File("path/to/dir"));
    Process process0 = processBuilder.start();
    

    顺便说一句,路径“/Users/Desktop/piano.java”看起来很奇怪。 Mac 上用户桌面的路径通常是/Users/username/Desktop, 所以你代码中的路径暗示你的用户名是“桌面”, 这很不寻常。

    而且,为了更轻松地使用该程序, 我建议将基本目录路径(/Users/username/Desktop)放在一个变量中, 而不是在多个地方对其进行硬编码。 这样就可以更轻松地进行更改,无需在多个位置进行编辑。

    【讨论】:

    • 我明白了,这解释了很多。因此,如果我想在编译后运行该文件。就像process = new ProcessBuilder(new String[]{"java","Piano"}).directory(new File("Users/Desktop/")).start();
    • @MarcoNeves 完全正确
    • 好吧,现在我只是得到“没有这样的文件或目录”。这可能是一个愚蠢的问题,但文件名是否必须包含在路径中?我的路径只是/Users/Desktop,文件“piano.java”就在那里。没有包装声明或任何东西。
    • @MarcoNeves 如果您只看到Piano.java(没有Piano.class),那么编译步骤似乎不起作用。如果您在终端中运行javac Piano.java in /Users/Desktop,而不是通过您的程序,它真的有效吗?
    • 是的,javac Piano.java 有效,java Piano 按预期运行。
    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多