Вам необходимо понять, что происходит, когда вы используете exec
в Java:
- Создан новый внешний процесс.
- Процесс выполняет команду, которую вы дали
- Процесс завершается.
Например, если вы сделаете это:
exec(". oraenv");
exec("someOracleCommand");
что будет:
- Первые процессы созданы.
- Первый процесс выполняет переменные окружения установки ". Oraenv" для этого процесса .
- Первый процесс завершается.
- Второй процесс создан.
- Второй процесс выполняет someOracleCommand со средой по умолчанию.
- Второй выход из процесса.
Видите проблему? Настройки переменных среды не передаются из первого процесса во второй.
На самом деле, то, что я сказал выше, не соответствует действительности. Запуск ". Oraenv", как это не будет работать ни при каких обстоятельствах. "." Команда является встроенной оболочкой и недоступна, если вы не используете оболочку. Что вышеупомянутое не делает. exec(". orenv")
не удастся.
Решение: вам нужно запустить . oraenv
и команду в одной оболочке, примерно так:
exec("/bin/bash", "-c",
". oraenv ; someOracleCommand");
То, что мы сделали, это поместили последовательность команд оболочки в одну строку и передали ее в оболочку для выполнения. Оболочка понимает, как анализировать последовательность команд ... и устанавливает переменные среды в среде оболочки так, чтобы они были доступны для следующих команд, выполняющихся в оболочке.