2

ローカル システムでコマンドを実行している 2 つの Java クラスがあります。私の開発システムは Mac、QA システムは Windows、製品システムは UNIX です。したがって、それぞれに異なるコマンドがあります。現時点では、違いをコメント/コメント解除する必要があります。両方のクラスは、実行可能ファイルとコマンドで同じ構造になっています。これが私が持っているものです。

// Linux (QA/Prod)
final String executable = "/user1/Project/Manufacturer/CommandCLI";
// final String executable = "cat"; // Mac Dev
//  final String executable = "cmd"; // Windows QA

final String command = "getarray model=" + model + " serialnum=" + serialnum;
// Windows QA(local laptop)
//final String command = "/C c:/Manufacturer/CommandCLI.bat getarray model=" + model + " serialnum=" + serialnum;
//Mac Dev
// final String command = "/TestData/" + computer.getId() + ".xml" 

ご覧のとおり、環境に応じてコメントを付けたりコメントを外したりしています。私の主な懸念の 1 つは、モデルと serialnum 変数に依存していることです。それを何らかの方法でプロパティに挿入できるかどうかはわかりません (model と serialnum はメソッド呼び出しで指定されます)。

Maven を使用しているため、「mvn clean package」中に -P フラグを追加してプロパティ ファイルを指定します。

これを処理するエレガントな方法は何ですか?

4

1 に答える 1

2

OS固有のコマンドを含むOSごとに1つずつ、3つの異なる方法を作成することをお勧めします。また、システム プロパティを使用して現在の OS を特定できます。この質問を確認してください。そして、このプロパティに基づいて適切なメソッドを呼び出します。例:

private runOnLinux(int model, int serialNum) { ... }
private runOnWindows(int model, int serialNum) { ... }
private runOnMac(int model, int serialNum) { ... }

// Somewhere in source code...
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("windows")) {
    runOnWindows(model, serialNum);
} else if (os.contains("linux") || os.contains("unix")) {
    runOnLinux(model, serialNum);
} else {
    // Mac!
    runOnMac(model, serialNum);
}

もちろん、このすべてのチェックが正しいかどうかはわかりません。冒頭で述べた質問への回答を確認することをお勧めします。より有用な情報が含まれています。

于 2013-06-17T13:02:56.270 に答える