Я знаю, что этот вопрос немного похож на этот , но мой относится к Windows и имеет решающее значение. У меня есть следующий кусок кода:
public static void main(String[] args) {
//String command = "\"psql --version\"";
String psqlPath = "\"C:\\Program Files\\PostgreSQL\\10\\bin\\psql.exe\"";
String command = "\""+psqlPath+" --version \"";
runPostgresqlTableCreator("start cmd.exe /k "+command);
}
private static void runPostgresqlTableCreator(String command) {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("cmd.exe", "/c", command);
try {
Process process = processBuilder.start();
process.waitFor();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Этот код работает с использованием psqlPath, в результате чего он запускает cmd и печатает версию PostgresQL как psql (PostgreSQL) 10.7
. Однако при использовании psql --version
он говорит, что 'psql' не распознается как внутренняя или внешняя команда,
работающая программа или командный файл . Запуск psql --version
на запущенном мной cmd также выводит версию. Переменные среды также установлены правильно. Из приведенной ссылки в ответе говорится, что в Java возникла проблема с распознаванием пути psql из переменных среды (хотя String command = "\"java -version\""
отображает версию Java).
Для Linux вполне допустимо указывать полный путь /usr/local/bin/psql
, потому что в большинстве случаев это всегда будет путь. Однако в Windows пользователи могут решить установить PostgresQL в любой каталог и на любой том диска, что затрудняет получение полного пути к psql.exe. В моем проекте настольного приложения, использующего JavaFX, мне нужно запустить несколько команд psql, но для чего-то другого, а не для версии. Я не хочу указывать место, где клиенты могут указать путь к psql.exe в интерфейсе.
Мой вопрос, таким образом, есть ли способ заставить psql работать без использования полного пути? (Обратите внимание, что меня интересует не версия Postgresql).