我在网上发现了一些代码来运行我的jar(从控制台输出真或假),然后读取它。在我的开发机器上,以下代码工作正常
private bool hasInformation(String value)
{
try
{
using (Process p = new Process())
{
p.StartInfo = new ProcessStartInfo("java", @" -jar myJarName.jar " + value);
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
String availableOrNot = p.StandardOutput.ReadToEnd();
p.WaitForExit();
//Trace.WriteLine("data = " + s);
availableOrNot = availableOrNot.Trim();
if (availableOrNot.Equals("true"))
{
return true;
}
return false;
}
}
catch (Exception e)
{
LogWriter.writeToLogFile(e);
}
return false;
}
问题在于,在我的测试机器上,代码只返回一个空字符串,就像它在执行之前抛出异常一样。
我不知道还有什么要检查,因为当我手动执行时,jar文件在命令行窗口中正常运行并且没有抛出异常(至少它没有被捕获)。所有这一切都是我得到一个空字符串,在我的开发机器上,我得到一个真或假的答案。
希望有人可能对可能出现的问题有一些想法,以便我可以调查,因为我真的被卡住了。
由于
编辑:重定向错误消息后,我可以从流中读取错误消息
无法访问jarfile myJarName.jar \ r \ n“
答案 0 :(得分:2)
根据您发布的新信息,可能是工作目录或CLASSPATH环境变量错误。
检查工作目录以查看它是否符合您的预期(我猜它应该与JAR文件的目录相同),或者设置它:
p.StartInfo.WorkingDirectory = "C:\\path to my JAR file";
或者,设置CLASSPATH:
p.StartInfo.EnvironmentVariables["CLASSPATH"] = "C:\\.....";
答案 1 :(得分:1)
问题的最可能原因似乎是两台计算机上的CLASSPATH
环境变量设置不同。在一种情况下,它包括myJarName.jar
,而另一种情况则不包括。{/ p>
答案 2 :(得分:0)
您必须更正代码,以允许读取输出。您必须初始化RedirectStandardOutput。例如,
var processInfo = new ProcessStartInfo(commandName, commandArgumentsForLogging);
processInfo.CreateNoWindow = true;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
processInfo.UseShellExecute = false;
processInfo.ErrorDialog = false;
var p = new Process { StartInfo = processInfo };