当前位置:  开发笔记 > 编程语言 > 正文

从我们的Java程序执行Java程序

如何解决《从我们的Java程序执行Java程序》经验,为你挑选了3个好方法。

我用了

Runtime.getRuntime().exec("_____")

但它抛出IOException如下:

java.io.IOException: CreateProcess: c:/ error=5
  at java.lang.Win32Process.create(Native Method)
  at java.lang.Win32Process.(Win32Process.java:63)
  at java.lang.Runtime.execInternal(Native Method

我不知道在指定路径或其他方面是否存在问题.任何人都可以帮我解决这些问题.



1> Mark..:

你正试图执行"C:/".你想要执行类似的东西:

"javaw.exe d:\\somejavaprogram\\program.jar"

注意路径分隔符.

我假设这是一个特别的项目,而不是一个大的项目.但是,从代码运行外部程序的最佳实践:

不要对可执行位置进行硬编码,除非您确定它永远不会改变

使用System.getenv查找%windir%等目录

不要假设javaw.exe之类的程序在搜索路径中:首先检查它们,或允许用户指定位置

确保考虑到空间:"cmd /c start " + myProg如果是myProg,则无法使用"my program.jar".


/ as路径分隔符在Windows中正常工作.

2> Stroboskop..:

您可以启动另一个JVM(如其他答案中详细描述的).但这不是我想要的解决方案.

原因是:

从java调用本机程序是"脏"的(有时会崩溃你自己的VM)

你需要知道外部JVM的路径(现代JVM不再设置JAVA_HOME)

你无法控制其他程序

无论如何,这样做的主要原因是,另一个应用程序也无法控制您的部分程序.更重要的是,如果其他应用程序不知道其线程101,那么像AWT-Thread这样的无响应系统线程也没有问题.

但!通过使用基本插件技术,您可以实现更多控制和类似行为.即只是调用"已知的接口方法",其他应用程序必须实现.(在这种情况下是"主要"方法).

只有它听起来并不像听起来那么容易.

您必须在运行时动态包含所需的jar(或将它们包含在应用程序的类路径中)

您必须将插件放在沙箱中,以防止将关键类泄露给其他应用程序

这需要一个自定义的类加载器.但要注意 - 实施这一点有一些隐藏的陷阱.另一方面,这是一个很好的练习.

所以,请选择:快速,肮脏或艰难但有益.



3> McDowell..:
java.io.IOException: CreateProcess: c:/ error=5
        at java.lang.Win32Process.create(Native Method)
        at java.lang.Win32Process.<init>(Win32Process.java:63)
        at java.lang.Runtime.execInternal(Native Method)

如果我没记错,错误代码5表示访问被拒绝.这可能是因为您的路径不正确(尝试执行"c:/")或者您正在碰撞您的操作系统安全性(在这种情况下,请查看权限).

如果您在查找Java可执行文件时遇到问题,通常可以使用系统属性找到它:

public class LaunchJre {

    private static boolean isWindows() {
        String os = System.getProperty("os.name");
        if (os == null) {
            throw new IllegalStateException("os.name");
        }
        os = os.toLowerCase();
        return os.startsWith("windows");
    }

    public static File getJreExecutable() throws FileNotFoundException {
        String jreDirectory = System.getProperty("java.home");
        if (jreDirectory == null) {
            throw new IllegalStateException("java.home");
        }
        File exe;
        if (isWindows()) {
            exe = new File(jreDirectory, "bin/java.exe");
        } else {
            exe = new File(jreDirectory, "bin/java");
        }
        if (!exe.isFile()) {
            throw new FileNotFoundException(exe.toString());
        }
        return exe;
    }

    public static int launch(List cmdarray) throws IOException,
            InterruptedException {
        byte[] buffer = new byte[1024];

        ProcessBuilder processBuilder = new ProcessBuilder(cmdarray);
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();
        InputStream in = process.getInputStream();
        while (true) {
            int r = in.read(buffer);
            if (r <= 0) {
                break;
            }
            System.out.write(buffer, 0, r);
        }
        return process.waitFor();
    }

    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec("c:/");

            List cmdarray = new ArrayList();
            cmdarray.add(getJreExecutable().toString());
            cmdarray.add("-version");
            int retValue = launch(cmdarray);
            if (retValue != 0) {
                System.err.println("Error code " + retValue);
            }
            System.out.println("OK");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

(经测试的Windows XP,Sun JRE 1.6; Ubuntu 8.04,OpenJDK JRE 1.6)

这相当于运行:

java -version

在尝试查找可执行文件时,您可能还需要查看"java.library.path"系统属性(和"path.separator").

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有