从控制台读取c#中的jar流

时间:2011-08-15 08:06:54

标签: c# java process

我在网上发现了一些代码来运行我的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“

3 个答案:

答案 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 };