【问题标题】:Java, inherit classpath with Runtime.exec()Java,使用 Runtime.exec() 继承类路径
【发布时间】:2010-12-02 01:28:32
【问题描述】:

我有一个程序将创建一个子进程,我希望它从其父进程继承所有类路径。在 javadoc 中,它说:

公共进程 exec(String[] cmdarray, 字符串 [] 环境) 抛出 IOException

在具有指定环境的单独进程中执行指定的命令和参数。

给定一个字符串数组 cmdarray,表示命令行的标记,和一个字符串数组 envp,表示“环境”变量设置,此方法创建一个新进程来执行指定的命令。

如果 envp 为 null,则子进程继承当前进程的环境设置。

当我将 envp 设置为 null 时,它没有继承任何东西。

代码如下:

System.out.print("Debug system path: "+System.getProperty("java.class.path"));
            startTime();
Process proc = Runtime.getRuntime().exec(cmd,null);

可以看到路径信息,但是这些路径信息并没有被新创建的进程继承。

【问题讨论】:

    标签: java


    【解决方案1】:

    您是如何指定应用程序的类路径的?如果不是通过CLASSPATH环境变量,就不会被继承。

    Runtime.exec方法可以调用任何原生应用,这里的envp指的是系统环境,不是你的java环境。

    如果你想将你的类路径传递给子 java 进程,你可以明确地这样做:

    String[] cmdarray = new String[] {
      "java", "-classpath", System.getProperty("java.class.path"), "com.example.MyChildApp", "appParam"};
    
    Process p = Runtime.getRuntime().exec(cmdarray);
    

    【讨论】:

    • 我试过了,它不能正常工作。不知道哪里错了
    【解决方案2】:

    没有办法。您调用 exec 时的“类路径”是您调用它时隐藏在当前类加载器中的任何内容。通常,您不能要求类加载器告诉您类路径。它可能是从数据库或火星上获取类。

    读取 java.class.path 会告诉您应用程序启动时发生了什么,但不会告诉您启动其他程序时发生了什么。

    【讨论】:

      【解决方案3】:

      最后我必须在 cmd 中插入“-cp System.getProperty("java.class.path")” 以使其工作。

      有没有更好的方法来做到这一点?

      【讨论】:

      • 如前所述,我认为这是最好的方法,但我想你也可以通过envp为子进程配置CLASSPATH环境变量来匹配System.getProperty("java.class.path")
      • 当我通过 envp 设置时,它会导致一些其他奇怪的问题。我不知道为什么,所以我尝试了这种方式,它成功了。
      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2012-02-25
      • 2015-11-16
      • 2015-03-14
      相关资源
      最近更新 更多