【问题标题】:Get working directory of another Java process获取另一个 Java 进程的工作目录
【发布时间】:2016-09-15 17:22:05
【问题描述】:

我可以使用以下代码获取当前 Java 程序的工作目录: Path path = Paths.get(*ClassName*.class.getProtectionDomain().getCodeSource().getLocation().toURI());

我还可以使用此命令wmic process get CommandLine where name='java.exe' /value获取运行 Java 进程的命令行参数(但输出中没有目录)

是否可以获取另一个 Java 进程的工作目录(以编程方式更好)?大概可以用一些 jdk/bin 实用程序来解决?

【问题讨论】:

  • ClassName.class.getProtectionDomain().getCodeSource().getLocation().toURI() 在某些情况下会失败。如果你想要当前目录,为什么不直接使用System.getProperty("user.dir")
  • getProtectionDomain().getCodeSource().getLocation() 将为您提供代码位置(顾名思义),它不一定与工作目录相同。当考虑到不同的类有不同的代码源时,这应该是显而易见的。此外,通过Paths.get 将该位置转换为Path 仅在它是file: URI 的情况下才有效,但会失败,例如对于 jar 文件中包含的类。如果你想要一个Path代表工作目录,Paths.get("")就足够了,如果你想知道它当前的绝对路径,那么使用Paths.get("").toAbsolutePath()...

标签: java windows process java-8 working-directory


【解决方案1】:

您可以通过Attach API 获取此信息。要使用它,您必须将 jdk 的 tools.jar 添加到您的类路径中。然后,下面的代码会打印出所有被识别的JVM进程的当前工作目录:

for(VirtualMachineDescriptor d: VirtualMachine.list()) {
    System.out.println(d.id()+"\t"+d.displayName());
    try {
        VirtualMachine vm = VirtualMachine.attach(d);
        try(Closeable c = vm::detach) {
            System.out.println("\tcurrent dir: "+vm.getSystemProperties().get("user.dir"));
        }
    }
    catch(AttachNotSupportedException|IOException ex) {
        System.out.println("\t"+ex);
    }
}

【讨论】:

  • 非常感谢您提供如此详细的回复。我是否正确理解我需要将 tools.jar...jdk/lib 文件夹复制到我的应用程序的 lib 文件夹,然后将其包含在类路径中?我的意思是我不能从JDK中包含它,因为它不会在其他环境中工作,对吧?
  • 编译时引用的tools.jar 不必与启动应用程序时引用的相同。所以你可以在编译时参考你当前JDK的tools.jar,在运行应用程序时参考运行时的tools.jar,假设它确实在jdk而不是裸jre上运行(我期待Java 9 这应该摆脱这种区别)。我建议用户无论如何都安装 JDK,即使他们没有开发,因为它不会尝试安装垃圾软件(不久前,服务器 JVM 仅在 JDK 中可用)
  • 拜托,你能再帮我一次吗?我使用您的代码,一切都在 IDE (Eclipse) 中运行,但编译后我收到此错误java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider could not be instantiated。我用这个命令java -Xmx512m -cp program.jar;lib\* xx.Program 启动程序。所有需要的文件都存在于 lib 文件夹中。我尝试了类路径中的两个位置,还尝试将 ...jdk/lib 目录添加到 PATH 变量中。可能是 java.exe 而不是 Eclipse 中的 javaw.exe 的问题?
  • 我明白了。在实际 JDK 路径之前有标准 java C:\ProgramData\Oracle\Java\javapath 环境变量。
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多