gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:42:16 29 4
gpt4 key购买 nike

当我启动任何第三方应用程序时,例如记事本(但您可以使用其他任何内容),从 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com