Java でユーザーのマシンに特定のソフトウェアがインストールされているかどうかを検出します
-
20-09-2019 - |
質問
実行する前に特定のソフトウェア (そのうちの 1 つは Perl) を必要とする Java アプリケーションがあります。Perl を検出するために私が行っていたことは次のとおりです。
Runtime.getRuntime().exec("perl Test.pl");
IOException が発生した場合は、Perl が存在しなかったことを宣言します。
しかし、私のユーザーの 1 人は、パス変数に Perl を入れていないためにアプリが失敗し続けると不満を言いました。だからこそ私はこう尋ねているのです。Perl (またはその他のソフトウェア) がユーザーのシステムにインストールされているかどうか、およびプログラムへのパスを検出する、オペレーティング システム間での方法はありますか?
解決
私は(ユーザー)、ターゲットオーディエンスを知らないが、失敗したときに、あなたは(FileChooserDialog)のパスを入力するようにユーザに促すことができ、その後、(例外が再スローされていない場合)、将来の使用のために、このパスを格納します。私はエラーが(私もプロパティファイルでこれらの値を更新または変更する方法を文書化)を初めて起こったときにそれらがその情報を提供することがOKだったので、いくつかの時間前、幸運にも私は、システム管理者だったユーザーを持っていたことでした。
ドンで述べたように他のオプションは、インストールに相対として必要なソフトウェアをインストールすることで、それがより一般的なオプションです。
他のヒント
この種の質問は時々飛び出すようですが、その答えは (ほとんど) 常にノーです。否定的な答えの最も一般的な理由は、Java が、設計上すべてのプラットフォームで同じである同種の仮想マシン環境で実行されるためです。抽象化できない、または少なくとも最もサポートされているプラットフォーム上で確実に実行できない操作は、簡単には実行できません。一般に、どの非 Java アプリケーションも実行/インストールされているかなど、OS 内の外部イベントを検出することは、「簡単ではない」カテゴリに分類されます。
確かに、この目的のための JNI ライブラリに対するニーズや市場は存在する可能性がありますが、それらは、 クロスプラットフォーム これらの質問は常にこの要件を望んでいるように見えます。そのため、短い答えは「いいえ」です。私が見る限り、あなたが現在行っていることは、含めるつもりがない限り、Perlを検出する最もクリーンな方法です perljvm またはプロジェクト内で同様のものを使用します。
ユーザーがそのどちらも望まない場合は、
- 合意された場所に Perl をインストールする
- Perl の場所を環境変数、構成ファイル、Windows レジストリなどに保存することで、Perl がインストールされている場所を示します。
その場合、ディスク全体で「Perl」という名前の実行可能ファイルを検索するしかないようです。明らかに、これには非常に長い時間がかかる可能性がありますが、場所をどこかに保存しておけば、少なくとも検索は 1 回だけで済みます。
のJava SDKを使用して、Windowsネイティブの情報を取得する外部のAPIのサポートなしでは不可能です。代わりに、(主にLGPLライセンスを取得し、完全にオープンされていない)外部APIを使用しての、我々はシェルが同じを取得するためにコマンドを使用することができます。
のステップ1 - (Perlの)アプリケーションがインストールされているかどうかの確認の
アプリケーションがインストールされているかどうかをチェックするために、次のPowerShellのコマンドのいずれかを実行したProcessBuilderかのRuntime.execを使用し、、
は、Get-ItemProperty HKLM:\ SOFTWARE \マイクロソフト\ Windowsの\ CurrentVersionの\アンインストール* |セレクト・オブジェクトのDisplayName |ここで、{$ _。DisplayNameに-match "perlの"} の
ソフトウェアのあなたの選択で「パール」を交換し、これらの出力をストリームし、それを処理します。
のPERLは、(上記の質問に対して)、パスを設定し、Javaからのperlスクリプトを実行するには、2段階の下に従っている場合の
ステップ2 - 可能な場合は、Javaコードを使用して環境パスに設定します。
。ステップ3 - あなたのperlスクリプトを実行します。
。