我试图使用Process.Start()
从C#控制台应用程序编译Java。这里是我的代码:Process.Start()找不到javac,尽管它在PATH
static string ProjectRootDirectory
{
get
{
return Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @"..\.."));
}
}
static void Main(string[] args)
{
var info = new ProcessStartInfo()
{
RedirectStandardOutput = true,
FileName = "javac",
Arguments = Path.Combine(ProjectRootDirectory, @"Java\Main.java"),
UseShellExecute = false
};
var proc = Process.Start(info);
using (var reader = proc.StandardOutput)
{
string s = reader.ReadToEnd();
System.Diagnostics.Debug.WriteLine(s);
Console.WriteLine(s);
Console.ReadKey();
}
}
当我运行它,我得到一个Process.Start()
因为Win32Exception
它说"The system cannot find the file specified."
不过,我已经通过PATH
设置为C:\Program Files\Java\jdk1.8.0_31\bin\
。这里是我的全PATH
(在年底发现Java的路径):
C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\wbem;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Users\James\utils\bash\;C:\Users\James\utils\batch\;C:\Program Files (x86)\Git\bin\;%JAVA_HOME%\bin\
这里是JAVA_HOME
环境变量我PATH
引用:
C:\Program Files\Java\jdk1.8.0_31\
当我手动键入javac [file]
进入命令提示符,它工作正常。但是在Process.Start()
中,我必须指定javac
的完整路径。任何想法为什么?
编辑:继Alexei Levenkov的建议下,我已经发现了PATH
确实是当前进程可见不同。打印Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process)
结果
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\NativeBinaries/x86;C:\ProgramData\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\windows\System32\wbem;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Users\James\utils\bash\;C:\Users\James\utils\batch\;C:\Program Files (x86)\Git\bin\
,这似乎是不包括javac
的路径。
放在Path.Combine(ProjectRootDirectory,@“的Java \ Main.java”)的手表,看看什么字符串实际上是 – reggaeguitar 2015-04-03 17:55:31
我得到的正确的路径,[项目目录] \ Java \ Main.java。此外,Process.Start()说它找不到javac.exe,而不是.java文件的路径。 – 2015-04-03 18:06:17
在调用'.Start'之前,C#进程可以看到明显的调试步骤是dump PATH变量 – 2015-04-03 18:28:14