我有两个在本地系统上运行命令的Java类。我的开发系统是Mac,我的QA系统是Windows,Prod系统是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"
所以,正如你所看到的 - 我正在评论和取消注释取决于环境。我主要担心的一个问题是我依赖于模型和serialnum变量 - 我不知道是否可以某种方式将其插入到属性中(模型和serialnum在方法调用中给出)。
我们正在使用Maven,所以在“mvn clean package”中我们添加-P标志来指定属性文件。
处理此问题的优雅方法是什么?
答案 0 :(得分:2)
我建议创建3个不同的方法:每个os包含一个特定于os的命令。您可以使用系统属性确定当前操作系统:检查this问题。并根据此属性调用适当的方法。例如:
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);
}
当然我不确定所有这些检查都是正确的。更好地检查我在开头提到的问题的答案。它包含更多有用的信息。