2011-08-15 13 views
2

私のjar(コンソールにtrueまたはfalseのいずれかに出力する)をC#から実行して読み込むコードがオンラインで見つかりました。開発マシンで次のコードが正常に動作しますコンソールからC#で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ファイルが手動で実行され、例外がスローされていないときに、jarファイルがコマンドラインウィンドウでうまく動作するため、何を確認するかわかりません(少なくともキャッチされません)。すべてのことが起こるのは、空の文字列が得られるということです。私の開発マシンでは、真または偽の答えが得られます。

誰かが間違っている可能性があることを知っている人がいるかもしれないので、私は本当に立ち往生しているように調査することができます。

おかげ

編集:私は、ストリームからそれを読み取ることができ、エラーメッセージをリダイレクトした後、私はアクセス

できないエラーを取得するjarファイルmyJarName.jar \ rを\ n」は

+0

おそらく、テストマシンでコードを別々に実行していますか?例えば。おそらくあなたの開発マシンのWindowsアプリケーションとは対照的に、ASP.Netアプリケーションから呼び出すでしょうか?ユーザー特権の違い(手動テストを行うときとコードを実行するときに同じユーザーの下で実行されるコード) –

+0

コードは同じユーザーで実行されていますが、設定が少し異なります。プロセスの産卵はブロックされますか? – rik

+0

まあ、間違いなく、問題の原因となっているセットアップでいくつかの違いがあるようです。正確な詳細を知らなければ、推測するのは難しいので、私はあなたにそれらの線に沿って考えるように努力しています。コードレベルのデバッグが役に立たない場合は、SysInternalsスイートを入手し、Process Monitor/Process Explorerを使用して、これらの呼び出しが行われたときにOSレベルで実際に何が起こるかを確認することをお勧めします。 Javaアプリケーションが起動していますか? –

答えて

2

あなたが投稿した新しい情報に基づいて、作業ディレクトリか、環境変数CLASSPATHが間違っている可能性があります。

それはあなたが(私はそれがそのJARファイルのディレクトリと同じでなければなりません推測している)期待するものだかどうかを確認するために作業ディレクトリを確認するか、それを設定します。

p.StartInfo.WorkingDirectory = "C:\\path to my JAR file"; 

また、CLASSPATH設定:

p.StartInfo.EnvironmentVariables["CLASSPATH"] = "C:\\....."; 
+0

作業ディレクトリが設定されていませんでした。これはまったくわかりません。なぜこれが起こるのだろうか?今のところ私はCドライブのフォルダに置いてテストするだけですが、ハードコーディングされたパスをエスケープしなければならないと思いますが、インストールされるとどうなりますか?ちょうどパスを先取りしますか? – rik

+0

他のパラメータProcessStartInfoオブジェクトで指定すると、.Netは異なるロジックを使用して、動作するパスを決定します。一見したところでは明らかではないが、トピックの[MSDNドキュメント](http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.workingdirectory.aspx)にはいくつかの洞察が得られるかもしれないUseShellExecuteがfalseに設定されていても、なぜ問題が発生していたのでしょうか。どちらの場合でも、おそらく最も具体的なものです。おそらくapp.configにパスを格納して、デプロイメント中/デプロイ後に構成可能にすることができますか? –

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 }; 
+0

OPは "例外はスローされていません"と言っています –

+0

はい、私は確認したいと思います。デバッグ時のコードは例外のcatchブロックにスキップしません - 空の文字列が返されます。 jarファイルは、マシン1 - '; C:¥Program Files¥Java¥jre6¥lib¥ext¥QTJava.zip'とマシン2'。; Cの手動で – rik

1

問題の原因としては、環境変数CLASSPATHが2台のマシンで異なって設定されている可能性が考えられます。あるケースでは、それはmyJarName.jarを含み、他のケースではそうではありません。

+0

クラスパスのコマンドを入力するときにコマンドラインから完全に実行されます。 :¥Program Files¥Java¥jre1.6.0_05¥lib¥ext¥QTJava.zip' – rik

+0

どちらの場合も、jarファイルがプロセスの作業ディレクトリにあることを確認してください。 –

+0

2番目のマシンがQTJava.zipを指しているように見えますが、そのフォルダにそのようなものはありません。はい、jarファイルは常に作業ディレクトリにあります(常にコピーするように設定されています) – rik

関連する問題