0

インフラストラクチャをテストするために内部で使用されるアプリケーションを維持しています。通常、テスト全体を通して 1 つのデバイスで実行する必要がありますが、このアプリケーションから情報を取得したり、実行時に操作したりする必要がある場合があります。この目的のために、CLI がありますが、残念ながら、新しい CLI コマンドを追加する方法について、私が自分で書いた手順を次に示します。

"""

CLI コマンドの追加

  • cli/client/commands/{category}/CLINewCommand.java および cli/server/commands/{category}/NewCommand.java に新しいコマンドのクラスを作成します。

  • CLIクラスは、CLICONfigCmd を拡張し、CLICommand を実装する必要があります。*

  • コマンドを cli/client/commands/SimServerCmd.java の列挙に追加し、cli/client/commands/CLICommandFactory.java で列挙された値を使用します。

  • コマンド クラスを cli/server/RepositoryInfo.java に追加し、パブリック メソッドを追加してサーバー側コマンドを呼び出します。このコマンドは、インタフェース RepositoryInfoMBean にも追加する必要があります。

  • * config/applicationContext.xml および config/cliApplicationContext.xml で新しいオブジェクトを初期化します。config/simulator_cli_conf.properties* に出力する文字列を追加します

"""

したがって、私の風変わりな自己発見の手順に従うことができた場合、CLI コマンドを追加するには、コマンド用に 2 つのクラスを作成し、4 つの異なるクラスを編集してから、2 つの Spring 構成ファイルと 1 つのプロパティ ファイルを編集する必要があります。

追加用。ただ。1。指示。

言うまでもなく、必要な CLI 機能の多くが欠落しています。

より良いデザインの提案はありますか? 簡単に拡張できる方がよいでしょう。

4

4 に答える 4

0

私が正しく理解している場合、すべてのコマンドはSpring Beanになり、特定の(マーカー)インターフェースを実装する必要がありますか?

だとしたらこれはどうでしょう。

  • コマンド インターフェイスは、実装する必要がある 1 つのメソッド execute(properties) を定義します。

  • コマンド サービスは、コマンドを選択して実行するための cli 機能を提供します。ここでは、検出されたすべてのコマンドをリストとして自動配線するだけで、機能がそれを使用します。

    ここで私が目にする唯一の問題は、コマンドが特定のパッケージに含まれている必要がない場合に、どのパッケージをスキャンするかを指定する方法です。この cli を内部でのみ使用する場合は、これらのコマンドを定義する必要がある最上位パッケージを指定し、このパッケージでコンポーネント スキャンをフックして、すべてのコマンドを構成なしでスプリングで検出できるようにします。

実装する必要があるのは、@Component で注釈が付けられた 1 つのコマンド クラスだけです。

于 2013-06-13T15:53:47.923 に答える
0

ServiceLoaderシステムを試してみてください。インターフェイスCLICommandに少なくとも次のものが含まれているようにします。

void execute(MyApplication app);
String cliName();
void setArgument(String argument);

新しいコマンドごとに jar を作成しMETA-INF/services/com.example.CLICommand、新しいコマンド クラスの完全修飾名をファイルに入れます。アプリケーション クラスで、次を使用してクラス パスをクエリします。

 private static ServiceLoader<CLICommand> cliLoader
     = ServiceLoader.load(CLICommand.class);

のコマンドを反復処理して、コマンドcliLoaderライン オプション名を取得します。

例えば、

public class VerboseCommand {
    private boolean verbose = false;
    public String cliName() {
        return "verbose";
    }

    public void setArgument(String argument) {
        if (argument != null && !argument.isEmpty()) {
            this.verbose = Boolean.valueOf(argument);
        } else {
            this.verbose = true;
        }
    }
    public void execute(MyApplication app) {
        app.setVerbose(verbose);
    }
}

ここで、誰かがコマンドを実行するverboseと、アプリケーションは行を確認し、それを引数に分割し、ルックアップを使用してインスタンスverboseを見つけ、VerboseCommandnull または空の文字列を送信します。次に、コマンドはアプリケーションのverbose属性を true に設定します。

ただし、そのようなことが好きな人は、JMX も使用してください。

于 2013-06-13T15:47:54.777 に答える