2015-04-03 62 views
0

我试图使用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的路径。

+0

放在Path.Combine(ProjectRootDirectory,@“的Java \ Main.java”)的手表,看看什么字符串实际上是 – reggaeguitar 2015-04-03 17:55:31

+0

我得到的正确的路径,[项目目录] \ Java \ Main.java。此外,Process.Start()说它找不到javac.exe,而不是.java文件的路径。 – 2015-04-03 18:06:17

+1

在调用'.Start'之前,C#进程可以看到明显的调试步骤是dump PATH变量 – 2015-04-03 18:28:14

回答

1

看到不同路径的最可能的原因:

您启动从桌面快捷方式VS(和相应的应用程序)(或开始菜单),使用默认路径。使用额外的CMD配置文件启动命令提示符,该文件添加更多路径。

修正:

  • 更新系统范围内的PATH变量包括javac的路径
  • 从你
  • 启动你的程序得到正确的PATH变量相同的命令提示符下启动VS(devenv.exe的)相同的命令提示符你从(而不是VS)得到正确的PATH变量。
+0

对不起,如果我没有说明:我发布在我的初始文章中的'PATH'变量是直接从环境变量对话框复制并粘贴的,所以_was_是我的系统范围的'PATH'。 – 2015-04-03 22:02:17

2

修复:自从我更新我的PATH后,我还没有关闭Visual Studio。

有时,该解决方案可以是简单的事情......

+1

愚蠢的M $ ......重新启动Visual Studio是一种方式 – 2016-04-12 11:07:48