Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从我们的Java程序执行一个Java程序_Java - Fatal编程技术网

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

从我们的Java程序执行一个Java程序,java,Java,我曾经 但它抛出一个IOException,如下所示: Runtime.getRuntime().exec("_____") java.io.IOException:CreateProcess:c:/error=5 位于java.lang.Win32Process.create(本机方法) 位于java.lang.Win32Process。(Win32Process.java:63) 在java.lang.Runtime.execInternal(本机方法 我不知道我在指定路径或其他方面是否

我曾经

但它抛出一个
IOException
,如下所示:

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

java.io.IOException:CreateProcess:c:/error=5
位于java.lang.Win32Process.create(本机方法)
位于java.lang.Win32Process。(Win32Process.java:63)
在java.lang.Runtime.execInternal(本机方法

我不知道我在指定路径或其他方面是否有问题。有人能帮我编写代码吗。

从java程序调用main如何

Test.main(空)


这对我来说很好

有什么原因不能直接在Java代码中调用它吗


如果有什么原因,我没有在执行Java程序时使用它,但您可以尝试使用它来执行大多数程序。

您必须在exec方法中传递可执行文件的路径。您真的要执行“-”进程吗


另外,请看一些有用的提示。

我记不起用于实现此功能的确切代码,但您必须传递“java.exe”(或等效代码)作为可执行文件,然后作为参数运行的类或jar,使用正确的工作目录。因此,这并不像只调用一个方法那么简单。

您正在尝试执行“C:/”。您需要执行类似以下内容:

“javaw.exe d:\\somejavaprogram\\program.jar”

请注意路径分隔符

我假设这是一个临时项目,而不是大型项目。但是,对于从代码运行外部程序的最佳实践:

  • 不要硬编码可执行文件的位置,除非你确定它永远不会改变
  • 使用System.getenv查找目录,如%windir%
  • 不要假设像javaw.exe这样的程序在搜索路径中:首先检查它们,或者允许用户指定位置
  • 请确保您考虑了空格:
    “cmd/c start”+myProg
    如果myProg是
    “my program.jar”
    ,则将不起作用

    • 我最近不得不这么做。
      我是这样做的,只挑选了相关部分:

      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
      
      private静态最终字符串[]straJavaArgs=
      {
      “?i/j2re/bin/java”,
      “-ms64m”,
      “-mx64m”,
      “-Djava.ext.dirs=?i/lib;?i/jar/lib;?i/jar”
      };
      // ...
      //AppDesc appToRun;
      List params=new ArrayList();
      //javaexe和参数
      addAll(ExpandStrings(straJavaArgs));
      //常见VM参数
      params.addAll(Arrays.asList(AppDesc.GetCommonVMArgs());
      //特定VM参数
      params.addAll(ExpandStrings(appToRun.GetVMArgs());
      //要运行的程序
      add(appToRun.GetClass());
      //它的论点
      params.addAll(ExpandStrings(appToRun.GetProgramArgs());
      //常见论点
      params.addAll(ExpandStrings(AppDesc.GetCommonProgramArgs());
      ProcessBuilder ProcessBuilder=新的ProcessBuilder(参数);
      process=processBuilder.start();
      return CaptureProcessOutput();//使用StreamGoBler类
      受保护的ArrayList ExpandString(字符串[]stra)
      {
      ArrayList alResult=新的ArrayList();
      对于(int i=0;i
      不完整,如果您需要更多详细信息,请询问

      private static final String[] straJavaArgs =
      {
         "?i/j2re/bin/java",
         "-ms64m",
         "-mx64m",
         "-Djava.ext.dirs=?i/lib;?i/jar/lib;?i/jar"
      };
      
      // ...
      
        // AppDesc appToRun;
        List<String> params = new ArrayList<String>();
        // Java exe and parameters
        params.addAll(ExpandStrings(straJavaArgs));
        // Common VM arguments
        params.addAll(Arrays.asList(AppDesc.GetCommonVMArgs()));
        // Specific VM arguments
        params.addAll(ExpandStrings(appToRun.GetVMArgs()));
        // The program to run
        params.add(appToRun.GetClass());
        // Its arguments
        params.addAll(ExpandStrings(appToRun.GetProgramArgs()));
        // The common arguments
        params.addAll(ExpandStrings(AppDesc.GetCommonProgramArgs()));
      
        ProcessBuilder processBuilder = new ProcessBuilder(params);
        process = processBuilder.start();
        return CaptureProcessOutput(); // Uses a StreamGobbler class
      
      protected ArrayList<String> ExpandStrings(String[] stra)
      {
        ArrayList<String> alResult = new ArrayList<String>();
        for (int i = 0; i < stra.length; i++)
        {
           // Super flexible, eh? Ad hoc for the current task, at least...
           alResult.add(stra[i]
                 .replaceAll("\\?i", strInstallDir)
                 .replaceAll("\\?c", strConfigDir)
           );
        }
        return alResult;
      }
      
      public enum AppDesc
      {
      // Enumerate the applications to run, with their parameters
      }
      
      如果我没记错的话,错误代码5表示访问被拒绝。这可能是因为您的路径不正确(尝试执行“c:/”),或者您的操作系统安全受到了影响(在这种情况下,请查看权限)

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

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

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

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

      原因是:

      • 从java调用本机程序是“肮脏的”(有时会使您自己的VM崩溃)
      • 您需要知道外部JVM的路径(现代JVM不再将JAVA_设置为HOME)
      • 你无法控制另一个程序
      不管怎么说,这样做的主要原因是,另一个应用程序也无法控制您的程序部分。更重要的是,如果另一个应用程序不知道它的线程,那么像AWT线程这样的无响应系统线程不会有问题

      但是!通过使用基本的插件技术,您可以实现更多的控制和类似的行为。例如,只需调用其他应用程序必须实现的“已知接口方法”(在本例中为“main”方法)

      只是要做到这一点并不像听起来那么容易

      • 您必须在运行时动态地包含所需的JAR(或者在应用程序的类路径中包含它们)
      • 你必须把插件放在一个沙箱中,以防止危及其他应用程序的关键类
      这需要一个定制的类加载器。但是要注意,在实现它的过程中有一些隐藏得很好的陷阱。另一方面,这是一个很好的练习


      所以,你可以选择:要么快速而肮脏,要么努力但有回报。

      我也有一个类似的问题。我需要在一个单独的虚拟机中运行一段Java代码,因为它通过JNI调用本机代码,而JNI偶尔会炸掉整个虚拟机

      不过我有点作弊。我最初使用Runtime调用一个简单的批处理命令文件,并将work in progress java命令放在其中。这使我能够根据需要对其进行调整,并在DOS提示符下运行该命令以便于测试。完成后,我只需将结果复制到Runtime调用中

      java -version
      
      上面的方法非常有效,不要将\“c:/program files/windows/notepad.exe \”作为可执行文件的参数,而是使用
      java -version
      
      public class Test {    
        public static void main(String[] args) throws Exception {    
          Process p = Runtime.getRuntime().exec("\"c:/program files/windows/notepad.exe\"");
          p.waitFor();
        }
      
      }
      
      $ process p = Runtime.getRuntime().exec("javac factorial.java"); in the try catch block
      
      try
      {
      process p = Runtime.getRuntime().exec("javac factorial.java");
      }
      catch(IOException e)
      {
      e.printStackTrace();
      }
      
       public class ProgA {
      
      /**
       * @param args the command line arguments
       */
      public static void main(String[] args) {
          System.out.println("Helllo print thr ProgA");
      
      }
      }
      }
      
      public class ProgB {
      
      
      public static void main(String[] args) {
          ProgA progA = new  ProgA();
          String arg[] = null;
          progA.main(arg);
      }
      }
      
      try {
        Runtime runTime = Runtime.getRuntime();
        Process process = runTime.exec("java -jar deleteDriveC.jar");
      } catch (IOException ex) {
        //jar file doesnt exist
        //Logger.getLogger(this.class.getName()).log(Level.SEVERE, null, ex);
      }
      
      import org.apache.tools.ant.taskdefs.Execute;
      
      Execute exe = new Execute();
      exe.setCommandline(new String[]{"java", "-version"});
      exe.execute();