2014-01-28 8 views
1

запущен с Runtime.getRuntime().exec(cmdLine, envp, workingDirectory); не может создать временный файлJava - процесс, начатый с Runtime.getRuntime() Exec (не может создать временный файл процесс

Он используется внутри Цитата Maven plugin for Eclipse

из mvn запущенных:

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

Full log

Это не Maven, связанные, как Gradle has the same issue

Demo piece of code работает с той же ошибкой.

 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); 

Update:

Передача TMP и TEMP переменные окружения не поможет.
Передача null вместо envp также не помогает.

Если envp равно null, подпроцесс наследует настройки среды текущего процесса.

+0

Остерегайтесь того, что каждый элемент в 'cmdLine' должен быть отдельным аргументом, переданным первому элементу в' cmdLine' (т.е. 'cmdline [0]' - это команда для выполнения, все остальные элементы являются отдельными аргументами). Прямо сейчас, вы 'bat' -файл получает один аргумент, который я сомневаюсь в том, что вы хотите;) – MadProgrammer

+0

Я прекрасно это понимаю. Это делается специально, в противном случае существует некоторая недокументированная обработка строки «a = b» (просто становится «b»). См. Http://stackoverflow.com/questions/21358548/java-runtime-getruntime-exec-looses-changes-some-parameters –

ответ

0

Решено путем передачи набора переменных окружения.