2

実行する前に特定のソフトウェア (そのうちの 1 つが Perl) を必要とする Java アプリケーションがあります。Perlを検出するために私が行っていたことは次のとおりです。

Runtime.getRuntime().exec("perl Test.pl");

IOException が発生した場合は、Perl が存在しないことを宣言します。

しかし、私のユーザーの 1 人が、パス変数に Perl を配置しなかったためにアプリが失敗し続けると不満を漏らしました。これが私が質問している理由です: Perl (または他のソフトウェア) がユーザーのシステムにインストールされているかどうか、およびプログラムへのパスを検出するクロスオペレーティング システムの方法はありますか?

4

4 に答える 4

6

この種の質問はときどき出てくるようですが、答えは(ほとんど)いいえです。否定的な回答の最も一般的な理由は、Java が、すべてのプラットフォームで設計上同じである同種の仮想マシン環境で実行されることです。少なくとも最もサポートされているプラ​​ットフォームで抽象化できない/確実に実行できない操作は、簡単には実行できません。どの非Javaアプリケーションも実行/インストールされているかなど、一般にOSで外部イベントを検出することは、その「簡単ではない」カテゴリに分類されます。

確かに、目的のためにJNIライブラリの必要性/市場がある可能性がありますが、これらの質問は常に望んでいるように見えるクロスプラットフォーム要件から大きく舵を取っているため、短い答えは「いいえ」です。私が見る限り、プロジェクトにperljvmなどを含めるつもりがない限り、あなたが現在行っていることは Perl を検出する最もクリーンな方法です。

于 2009-08-30T16:20:29.730 に答える
3

ユーザーがどちらも望まない場合

  • 合意した場所に perl をインストールする
  • 環境変数、設定ファイル、Windows レジストリなどに場所を保存することで、perl がインストールされている場所を示します。

その場合、「Perl」という名前の実行可能ファイルをディスク全体で検索することが唯一のオプションのようです。明らかにこれには非常に長い時間がかかる可能性がありますが、場所をどこかに保存している場合は、少なくとも 1 回検索するだけで済みます。

于 2009-08-30T16:21:23.240 に答える
1

対象ユーザー (ユーザー) はわかりませんが、失敗した場合、ユーザーにパス (FileChooserDialog) を入力するように促し、将来の使用のためにこのパスを保存することができます (例外が再びスローされない場合)。幸運なことに、システム管理者であるユーザーがいたので、最初にエラーが発生したときにその情報を提供しても問題ありませんでした (プロパティ ファイルでこれらの値を更新または変更する方法も文書化しました)。

ドンが言及した他のオプションは、インストールに関連して必要なソフトウェアをインストールすることです。これはより一般的なオプションです。

于 2009-08-30T16:29:30.680 に答える
0

外部 API のサポートなしでは、Java SDK を使用して Windows ネイティブ情報を取得することはできません。外部 API (ほとんどが LGPL ライセンスであり、完全にオープンではない) を使用する代わりに、シェル コマンドを使用して同じものを取得できます。

ステップ 1 - (perl) アプリケーションがインストールされているかどうかを確認する

アプリケーションがインストールされているかどうかを確認するには、ProcessBuilder または Runtime.exec を使用して、次の PowerShell コマンドのいずれかを実行します。

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall* | Select-Object DisplayName | where {$_.DisplayName -match "perl"}

「perl」を選択したソフトウェアに置き換え、これらの出力をストリーミングして処理します。

PERL の場合 (上記の質問の場合)、以下の 2 つの手順に従ってパスを設定し、Java から Perl スクリプトを実行します。

ステップ 2 - 利用可能な場合は、Java コードを使用して環境パスに設定します。

ステップ 3 - perl スクリプトを実行します。

于 2014-06-18T19:30:53.287 に答える