- Environment Variables
- Querying Environment Variables
- Passing Environment Variables to New Processes
- Platform Dependency Issues
- Переменная окружения JAVA_HOME – что это такое и она нужна
- Что такое JAVA_HOME
- Какие программы используют JAVA_HOME
- Ошибки, связанные с JAVA_HOME
- Как установить переменную окружения JAVA_HOME в Windows
- Резюме
- Управление переменными среды в Java
- Вступление
- Запрос переменных среды
- Конструктор процессов и окружающая среда
- Git Essentials
- Вывод
- Как установить переменные окружения из Java?
- Только Linux
Environment Variables
Many operating systems use environment variables to pass configuration information to applications. Like properties in the Java platform, environment variables are key/value pairs, where both the key and the value are strings. The conventions for setting and using environment variables vary between operating systems, and also between command line interpreters. To learn how to pass environment variables to applications on your system, refer to your system documentation.
Querying Environment Variables
On the Java platform, an application uses System.getenv to retrieve environment variable values. Without an argument, getenv returns a read-only instance of java.util.Map , where the map keys are the environment variable names, and the map values are the environment variable values. This is demonstrated in the EnvMap example:
With a String argument, getenv returns the value of the specified variable. If the variable is not defined, getenv returns null . The Env example uses getenv this way to query specific environment variables, specified on the command line:
Passing Environment Variables to New Processes
When a Java application uses a ProcessBuilder object to create a new process, the default set of environment variables passed to the new process is the same set provided to the application’s virtual machine process. The application can change this set using ProcessBuilder.environment .
Platform Dependency Issues
There are many subtle differences between the way environment variables are implemented on different systems. For example, Windows ignores case in environment variable names, while UNIX does not. The way environment variables are used also varies. For example, Windows provides the user name in an environment variable called USERNAME , while UNIX implementations might provide the user name in USER , LOGNAME , or both.
Источник
Переменная окружения JAVA_HOME – что это такое и она нужна
Во многих статьях в интернете, документации к инструментам для разработки на Java и в книгах зачастую упоминается JAVA_HOME. Что же такое JAVA_HOME?
Что такое JAVA_HOME
JAVA_HOME это переменная окружения, указывающая на директорию с установленным JDK (Java Development Kit, комплект разработчика Java). JAVA_HOME это соглашение, используемое во многих программах из экосистемы Java.
Какие программы используют JAVA_HOME
- Intellij IDEA, Eclipse, NetBeans
- Apache Maven, Apache Ant, Gradle
- Apache Tomcat
- Jenkins
Некоторые игры, написанные на Java (например, Minecraft), тоже могут требовать установленной переменной JAVA_HOME.
Ошибки, связанные с JAVA_HOME
Если переменная окружения JAVA_HOME не определена, некоторые программы могут выдавать следующие ошибки:
- Переменная среды java_home не определена
- Cannot determine a valid Java Home
- JAVA_HOME is set to an invalid directory
- JAVA_HOME is not defined correctly
- JAVA_HOME environment variable is not set
- JAVA_HOME command not found
- JAVA_HOME not found in your environment
- JAVA_HOME does not point to the JDK
При появлении таких ошибок просто установите переменную JAVA_HOME
Как установить переменную окружения JAVA_HOME в Windows
Сперва вам нужно установить JDK или JRE.
- Установите JDK, если вы занимаетесь разработкой программ на Java
- Установите JRE, если вам нужно только запустить прикладную программу на Java
После установки JDK либо JRE запишите путь установки, он понадобится.
Теперь щёлкните правой кнопкой на «Мой компьютер» → «Свойства» → «Дополнительные параметры системы» → «Переменные среды…». В разделе «Системные переменные» нажмите кнопку «Создать…» и укажите следующие данные:
Имя переменной | JAVA_HOME |
Значение переменной | Путь к директории JDK / JRE, например: C:\Java\jdk-11.0.6 |
Сохраните изменения, кликнув «OK». Теперь выберите в списке переменную окружения Path и нажмите «Изменить…». В конце списка добавьте строчку со значением «%JAVA_HOME%\bin«
Для проверки откройте консоль (Win+R, cmd) и укажите последовательно укажите две команды:
Если вы правильно установили JDK/JRE и правильно установили переменные окружения, вы увидите вывод наподобие этого:
Это будет служить результатом того, что переменная JAVA_HOME установлена правильно и Java работает из командной строки.
Резюме
В данной статье мы рассказали вам, что являет собой переменная окружения JAVA_HOME, где она используется и как её корректно указать.
Источник
Управление переменными среды в Java
В этом руководстве мы будем управлять переменными среды с помощью Java с примерами получения имен и ключей переменных среды, а также их настройки и запуска процессов.
Автор: Darinka Zobenica
Дата записи
Вступление
Переменные называются ячейками памяти. Их значения сохраняются в памяти, которую мы обычно не можем запомнить, поскольку они не подходят для человека и меняются местами. Хотя, если мы назовем ячейку памяти, например a , ее будет намного легче запомнить.
Переменные среды во многом похожи на обычные переменные программирования, за исключением того, что они заданы где-то вне программы. Это может быть использовано операционной системой, JVM, микросервисом, который использует наша программа, и т. Д.
Точнее, это пары ключ/значение , где ключ-это то, что можно рассматривать как имя переменной среды, а значение-это, ну, значение. Их значения всегда являются строками.
Когда люди ссылаются на переменные среды, они обычно имеют в виду те, которые установлены операционной системой. Вероятно, в прошлом вам приходилось иметь дело с PATH и JAVA_HOME – это переменные среды.
Переменные среды различаются в разных операционных системах, и иногда бывает сложно создавать переносимые программы, которые полагаются на них, но ничто не делает их по своей сути трудными для работы.
Переменные окружения операционной системы имеют свой аналог в мире JVM – Свойства . Они выходят за рамки этой статьи, но стоит упомянуть, что они являются довольно похожей концепцией в меньшем масштабе.
Запрос переменных среды
Ваша операционная система хранит свои переменные среды в виде пар ключ/значение. Вы можете использовать System.getenv() для получения этих значений. Если вы используете его без аргумента, вы получите Map объект в качестве возвращаемого значения:
Вот усеченное представление результатов:
Вы также можете передать ему Строку , соответствующую имени переменной (ключу), и он вернет значение соответствующей переменной в виде Строки :
Конструктор процессов и окружающая среда
В Java есть класс Process для работы с процессами операционной системы. Чтобы упростить создание процесса, существует класс ProcessBuilder , и вы можете просто “добавить” команды в его экземпляр для запуска.
Каждый процесс может иметь свою собственную среду. Ваша программа будет иметь свою среду, заданную операционной системой, но программы, которые вы запускаете как процессы, могут иметь измененную “ручную” среду.
Чтобы отредактировать среду, вам необходимо извлечь ее ссылку из вашего объекта ProcessBuilder с помощью environment() getter. Как и при чтении переменных среды из System , вы получите Карту , а затем сможете изменить ее с помощью обычных Map операций.
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
После создания среды мы создадим команду. Это зависит от операционной системы. Здесь у нас есть элементарная проверка, которая адекватно изменяет команду:
Мы создали новую переменную среды с именем PING_WEBSITE с фиксированным значением. Вы можете изменить эту программу, чтобы задать значение PING_WEBSITE для ввода пользователем, аргумента командной строки или считывания значения из файла.
Если вы хотите прочитать о том , как анализировать и сопоставлять аргументы командной строки в Java или как получить ввод Uset в Java, мы вам поможем!
Вывод
Мы представили концепцию переменных среды, объяснили, для чего они используются, и аналогичные концепции, а также их системно-зависимую природу.
Источник
Как установить переменные окружения из Java?
Как установить переменные окружения из Java? Я вижу, что я могу сделать это для использования подпроцессов ProcessBuilder . У меня есть несколько подпроцессов для запуска, поэтому я бы предпочел изменить среду текущего процесса и позволить подпроцессам наследовать ее.
Есть System.getenv(String) для получения одной переменной среды. Я также могу получить Map полный набор переменных окружения с System.getenv() . Но, призывая put() к этому Map бросает UnsupportedOperationException — очевидно, они означают, что среда должна быть только для чтения. И нет System.setenv() .
Итак, есть ли способ установить переменные среды в текущем процессе? Если да, то как? Если нет, в чем смысл? (Это потому, что это Java, и поэтому я не должен делать злых непереносимых устаревших вещей, таких как прикосновение к моей среде?) И если нет, то любые полезные предложения по управлению изменениями переменных среды, которые я собираюсь передать нескольким подпроцессы?
(Это потому, что это Java, и поэтому я не должен совершать злые непереносимые устаревшие вещи, такие как прикосновение к моей среде?)
Я думаю, что ты ударил гвоздь по голове.
Возможный способ облегчить бремя — это выделить метод
и передайте любые ProcessBuilder s через это прежде, чем начать их.
Кроме того, вы, вероятно, уже знаете это, но вы можете запустить более одного процесса с одним и тем же ProcessBuilder . Так что, если ваши подпроцессы одинаковы, вам не нужно делать это снова и снова.
Для использования в сценариях, где вам нужно установить конкретные значения среды для модульных тестов, вам может пригодиться следующий хак. Это изменит переменные окружения во всей JVM (поэтому убедитесь, что вы сбросили все изменения после теста), но не изменит вашу системную среду.
Я обнаружил, что комбинация двух грязных хаков Эдварда Кэмпбелла и анонимного работает лучше всего, поскольку один из них не работает в Linux, а другой не работает в Windows 7. Поэтому, чтобы получить многоплатформенный злой хак, я объединил их
Это работает как шарм. Полные кредиты двум авторам этих хаков.
Или добавить / обновить одну переменную и удалить цикл согласно предложению thejoshwolfe.
в Android интерфейс представлен через Libcore.os как своего рода скрытый API.
Класс Libcore, а также интерфейс ОС являются общедоступными. Просто объявление класса отсутствует и должно быть показано компоновщику. Не нужно добавлять классы в приложение, но это также не повредит, если оно включено.
Только Linux
Установка отдельных переменных среды (на основе ответа Эдварда Кэмпбелла):
Использование:
Во-первых, поместите метод в любой класс, который вы хотите, например, SystemUtil. Затем назовите это статически:
Если вы позвоните System.getenv(«SHELL») после этого, вы «/bin/bash» вернетесь.
Это комбинация ответа @ paul-blair, преобразованного в Java, который включает в себя некоторые исправления, указанные Полом Блэром, и некоторые ошибки, которые, похоже, были внутри кода @pushy, который состоит из @Edward Campbell и anonymous.
Я не могу подчеркнуть, насколько этот код должен использоваться ТОЛЬКО в тестировании, и он очень хакерский. Но для случаев, когда вам нужна настройка среды в тестах, это именно то, что мне нужно.
Это также включает в себя некоторые мелкие штрихи, которые позволяют коду работать на обеих Windows, работающих на
а также Centos работает на
Оказывается, решение от @ pushy / @ anonymous / @ Edward Campbell не работает на Android, потому что Android на самом деле не Java. Конкретно у Android нет java.lang.ProcessEnvironment вообще. Но в Android это оказывается проще, вам просто нужно сделать JNI-вызов в POSIX setenv() :
Как и большинство людей, которые нашли этот поток, я писал некоторые модульные тесты, и мне нужно было изменить переменные среды, чтобы установить правильные условия для выполнения теста. Тем не менее, я обнаружил, что ответы с наибольшим количеством голосов имели некоторые проблемы и / или были очень загадочными или чрезмерно сложными. Надеюсь, это поможет другим быстрее разобраться в решении.
Во-первых, я наконец нашел решение @Hubert Grzeskowiak самым простым, и оно сработало для меня. Я хотел бы прийти к этому первым. Это основано на ответе Эдварда Кэмпбелла, но без усложнения циклического поиска.
Однако я начал с решения @ pushy, которое получило наибольшее количество голосов. Это комбинация @anonymous и @Edward Campbell’s. @pushy утверждает, что оба подхода необходимы для охвата как среды Linux, так и Windows. Я работаю под OS X и обнаружил, что оба работают (как только проблема с подходом @anonymous решена). Как уже отмечали другие, это решение работает большую часть времени, но не все.
Я думаю, что источником большей части путаницы является решение @ anonymous, работающее в области «TheEnvironment». Глядя на определение структуры ProcessEnvironment , «theEnvironment» — это не карта , а карта . Очистка карты работает нормально, но операция putAll перестраивает карту Map , что потенциально вызывает проблемы, когда последующие операции работают с структурой данных с использованием обычного API, который ожидает Map . Кроме того, доступ / удаление отдельных элементов является проблемой. Решение состоит в том, чтобы получить доступ к «Среде» косвенно через «Немодифицируемую Среду». Но так как это тип UnmodifiableMapдоступ должен быть сделан через закрытую переменную ‘m’ типа UnmodifiableMap. Смотрите getModifiableEnvironmentMap2 в коде ниже.
В моем случае мне нужно было удалить некоторые переменные окружения для моего теста (остальные должны быть неизменными). Затем я хотел восстановить переменные среды до их прежнего состояния после теста. Процедуры ниже делают это прямо вперед, чтобы сделать. Я протестировал обе версии getModifiableEnvironmentMap на OS X, и обе работают одинаково. Хотя на основе комментариев в этой теме, один может быть лучшим выбором, чем другой, в зависимости от среды.
Примечание: я не включил доступ к ‘theCaseInsensitiveEnvironmentField’, так как это, похоже, специфично для Windows, и у меня не было возможности проверить его, но добавить его было бы просто.
Источник