使用 ProcessBuilder 执行本地可执行文件

Exec local executable with ProcessBuilder

网上找不到解决办法,所以想在这里问一下

我有一个such structure of a project

我想要的:我希望 ProcessBuilder 使用我的本地 adb.exe

例如我的 ProcessBuilder 的 String[]:

case "devicesListString":
    String[] devicesListString = {"./adb.exe","devices"};
    return devicesListString;

ProcessBuilder 是这样启动的

public Process initNewProcessBuilderOnProcess(Tab tab, String[] str) throws IOException {
    ProcessBuilder vr = new ProcessBuilder(str);
    vr.directory(new File(System.getProperty("user.dir")));
    vr.redirectErrorStream(true);
    Process pr = vr.start();
    tabAndProcessMap.put(tab, pr);
    return pr;
}

vr.directory 已添加,但没有结果。 如何访问 adb.exe 的资源? 也许我需要别的东西,而不是 ProcessBuilder?

假设应用程序资源是实际文件是不可靠的。相反,使用 Java 的 getResource* 方法之一来读取资源,并将其复制到实际文件中:

Path adb = Files.createTempFile("adb", ".exe");

try (InputStream stream = Testinghelper.class.getResourceAsStream("adb.exe")) {
    Files.copy(stream, adb, StandardCopyOption.REPLACE_EXISTING);
}

ProcessBuilder builder = new ProcessBuilder(adb.toString(), "devices");

在 Windows 以外的操作系统上,可能需要使新文件可执行,然后再将其传递给 ProcessBuilder:

PosixFileAttributeView view =
    Files.getFileAttributeView(adb, PosixFileAttributeView.class);
if (view != null) {
    Set<PosixFilePermission> perms = view.readAttributes().permissions();
    if (perms.add(PosixFilePermission.OWNER_EXECUTE)) {
        view.setPermissions(adb, perms);
    }
}