Программно получить полные пути внешних программ из Eclipse - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь получить полный путь системных программ, используя следующий код Java:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PathExtractor {

    public static void main(String[] args) throws Exception {
        ProcessBuilder processBuilder = new ProcessBuilder("which", "mvn");
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();
        process.waitFor();
        try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            System.out.println(in.readLine());
        }
    }
}

При компиляции и запуске из командной строки выводится ожидаемый результат:

/ USR / местные / бен / МВН

Однако при запуске в Eclipse я получаю значение выхода 1 со следующим выводом:

нуль

После небольшого исследования я нашел похожий вопрос: этот ответ предлагает запустить оболочку для запуска предыдущей команды:

new ProcessBuilder("/bin/sh", "-c", "which mvn")

К сожалению, команда все еще не работает с выводом null. Обратите внимание, что на компьютере под управлением Windows просто использование new ProcessBuilder («где», «mvn») дает желаемый эффект.

Как определить программный путь программ из Eclipse?

1 Ответ

0 голосов
/ 17 апреля 2019

После некоторого копания мне удалось программно получить полные пути внешних программ из Eclipse с помощью следующей команды:

new ProcessBuilder("/bin/bash", "-l", "-c", "which mvn")

Флаг -l (или --login) является ключом к решению. Согласно справочной странице bash :

заставить bash действовать так, как если бы он был вызван как оболочка входа в систему

[...]

Когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром --login, сначала она читает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login, и ~ / .profile, в этом порядке, и читает и выполняет команды из первый, который существует и доступен для чтения.

Другими словами, это позволит внешней программе выбрать переменную PATH из одного из стандартных местоположений, даже если в самом Eclipse для нее может быть задано другое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...