Ce code utilise la commande «where» sous Windows et la commande «which» sur les autres systèmes pour vérifier si le système connaît le programme souhaité dans PATH. Si trouvé, la fonction retourne un fichier java.nio.file.Path au programme, et null sinon. J'ai testé avec Java 8 sur Windows 7 et Linux Mint 17.3.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Logger;
public class SimulationUtils
{
private final static Logger LOGGER = Logger.getLogger(SimulationUtils.class.getName());
public static Path lookForProgramInPath(String desiredProgram) {
ProcessBuilder pb = new ProcessBuilder(isWindows() ? "where" : "which", desiredProgram);
Path foundProgram = null;
try {
Process proc = pb.start();
int errCode = proc.waitFor();
if (errCode == 0) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()))) {
foundProgram = Paths.get(reader.readLine());
}
LOGGER.info(desiredProgram + " has been found at : " + foundProgram);
} else {
LOGGER.warning(desiredProgram + " not in PATH");
}
} catch (IOException | InterruptedException ex) {
LOGGER.warning("Something went wrong while searching for " + desiredProgram);
}
return foundProgram;
}
private static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().contains("windows");
}
}
Pour l'utiliser:
System.out.println(SimulationUtils.lookForProgramInPath("notepad"));
Sur mon système Windows 7, il affiche:
C: \ Windows \ System32 \ notepad.exe
Et sur Linux:
System.out.println(SimulationUtils.lookForProgramInPath("psql"));
/usr/bin/psql
L'avantage de cette méthode est qu'elle devrait fonctionner sur toute plate-forme et il n'y a pas besoin d'analyser la variable d'environnement PATH ou consultez le Registre. Le programme désiré n'est jamais appelé, même s'il est trouvé. Enfin, il n'y a pas besoin de connaître l'extension du programme. gnuplot.exe sous Windows et sous Linux gnuplot serait à la fois être trouvé par le même code:
SimulationUtils.lookForProgramInPath("gnuplot")
suggestions d'amélioration sont les bienvenus!
Je pense qu'il serait préférable de le faire "qui svn" au lieu de "svn aide". Il donnera toujours le bon code de retour pour savoir si svn existe dans le chemin, mais si vous réussissez, vous obtiendrez également le chemin complet vers l'exécutable svn. – Apreche
"qui" n'est pas une commande Windows. – EMMERICH
"where" est l'équivalent Windows de "which" –