我需要在符号链接目录中从Java运行本地进程。让我们创建以下目录结构:
guido@Firefly:~/work$ tree
.
└── path
└── to
└── symlink -> /home/guido/work
3 directories, 0 files
我正在从
〜/work
目录启动Java应用程序,并希望在〜/work/path/to/symlink
目录中运行本机进程。然而,如果我使用以下Java代码,则符号链接工作目录将解析为真实路径。 相反,我想在绝对路径中运行该命令。
(请注意,
pwd
命令只是为了说明,并且应该替换为“真正的”命令(例如,在我的情况下使用go build
)。)File baseDir = new File("/home/guido/work");
File link = new File(baseDir, "path/to/symlink");
Files.createSymbolicLink(link.toPath(), baseDir.toPath());
Process process = new ProcessBuilder()
.command("pwd")
.directory(link)
.start();
String output = getOutput(process);
System.out.println(output); // Prints: /home/guido/work
我能通过以下解决方法满足我的需求,但是为了能够在特定目录下触发一个简单的进程而启动一个 shell 看起来很愚蠢。此外,我失去了平台独立性。
String[] cmd = {"/bin/sh", "-c", "cd " + link + " && pwd"};
Process process = Runtime.getRuntime().exec(cmd);
String output = getOutput(process);
System.out.println(output); // Prints: /home/guido/work/path/to/symlink
在这里,您可以找到一个完整的示例,其中包含单元测试Gist和两种解决方案。
pwd
只是一个示例命令,我需要用“真实”的命令来替换它。我将稍微修改一下描述。 - Vít Kotačka