java - 为什么它保持 lib/modules 锁定?

标签 java windows java-9

当我启动任何第三方应用程序时,例如记事本(但您可以使用其他任何内容),从 Java 9 应用程序中退出,然后退出 Java 应用程序:

import java.io.*;

public class LaunchNotepad {
  public static void main(String[] args) throws IOException {
    Runtime.getRuntime().exec(new String[] {"C:\\Windows\\notepad.exe"});
  }
}

启动的第三方应用程序一直锁定 Java 9 的 lib\modules 文件。这使得我们的具有私有(private) JRE 的 Java 应用程序很难自行更新,因为无法重命名原始目录(包含 JRE)。这是来自 ProcessExplorer (Sysinternals) 的屏幕截图:

Screenshot of ProcessExplorer showing the notepad process launched by Java 9

这闻起来像 Java 9 的错误(报告为 JDK-8194734),但是有一种解决方法可以在不锁定 lib\modules 文件的情况下在 Windows 上启动应用程序,例如通过使用将传递的参数作为应用程序简单地启动的外部(代理)应用程序?

最佳答案

fixed this bug .这算作一种解决方法吗? :)

否则,确实有一些解决方法。

解决方法 1:使用 awt.Desktop

扫描Java源码,发现awt.Desktop可以为我们调用ShellExecute

不幸的是,此方法不允许传递命令行参数。您可以将临时批处理文件写入磁盘并启动它作为解决方法。

import java.io.*;
import java.awt.Desktop;

public class LaunchNotepad {
  public static void main(String[] args) throws IOException {
    File program = new File("C:\\Windows\\notepad.exe");
    Desktop.getDesktop().open(program);
  }
}

解决方法 2:使用 PsExec 作为代理

SysInternals PsExec不会将文件继承到以它启动的进程中。记得使用 -d 参数,否则 PsExec 自己会保存文件。

使用 cmd.exe 作为代理是不可能的,因为它总是继承句柄。

解决方法 3:制作您自己的代理

您需要使用以下两个 WINAPI 之一:CreateProcess (指定 bInheritHandles=FALSE)或 ShellExecute .

关于java - 为什么它保持 lib/modules 锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48131595/

相关文章:

java - 我可以在 JAVA 的属性文件中使用正则表达式吗?

java - 运行java应用程序时如何将类路径放入属性文件中?

c - Ubuntu/Windows 中的不同输出

java - 使 "gradle javadoc"任务与 Java 9 一起工作

java - 如果用户尝试获取有错误的脚本,jshell 会静默结束

java - 发现太多项目时如何在 Java Stream 中指定谓词

java - 我的问题是关于 find(Node root ,int level) 方法。这是关于在给定二叉树中查找最深节点的代码

java - 空 LibGdx 游戏循环泄漏内存

c - 如何在 C 语言中唯一标识一台机器?

java - Java 工具用于自动从 jar 名称派生模块名称的算法