Java-使用runtime.getRuntime().执行启动的进程(无法创建临时文件



Runtime.getRuntime().exec(cmdLine, envp, workingDirectory);启动的过程无法创建临时文件。

它用于Maven插件中的Eclipse

mvn启动的报价:

 Caused by: java.io.IOException: �ܾ���ʡ�
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createTempFile(File.java:1879)

完整日志

这与Maven无关,因为Gradle有相同的问题

演示代码陷入相同的错误。

        String mavenPath = "D:\Progs\springsource\apache-maven-3.0.4\bin\mvn.bat";
        String mavenOptions  = "-X compile exec:java -Dexec.mainClass=runclass.Runme";
        String[] cmdLine = new String[2];
        cmdLine[0] = mavenPath;  //cmdLine.add(mavenPath);
        cmdLine[1] = mavenOptions;      //cmdLine.add(mavenOptions+" compile exec:java -Dexec.mainClass="+packageClass);        
        String[] envp = new String[2];
        //Map<String, String> envm = new HashMap<String, String>();
        envp[0] = "JAVA_HOME=" + System.getProperty("java.home"); //System.getenv("JAVA_HOME");
        envp[1] = "M2_HOME=" + System.getenv("MAVEN_HOME");     
        File workingDirectory = null;
        String currentDir = new File(".").getAbsolutePath();
        log(currentDir);
        String userDir = System.getProperty("user.dir"); //User working directory ; "user.home"     User home directory
        workingDirectory = new File(userDir);       
        log(workingDirectory.toString());
        //
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(cmdLine, envp, workingDirectory);
        InputStream stdout = proc.getInputStream();
        InputStream stderr = proc.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stdout);
        InputStreamReader isr2 = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        BufferedReader br2 = new BufferedReader(isr2);

更新:

通过TMP和温度环境变量无济于事。
通过null而不是envp也无济于事。

如果Envp为null,则子过程继承了当前过程的环境设置。

通过传递一组环境变量解决了。

最新更新