Java jvm environment variables

Управление переменными среды в Java

В этом руководстве мы будем управлять переменными среды с помощью Java с примерами получения имен и ключей переменных среды, а также их настройки и запуска процессов.

Вступление

Переменные называются ячейками памяти. Их значения сохраняются в памяти, которую мы обычно не можем запомнить, поскольку они не подходят для человека и меняются местами. Хотя, если мы назовем ячейку памяти, например a , ее будет намного легче запомнить.

Переменные среды во многом похожи на обычные переменные программирования, за исключением того, что они заданы где-то вне программы. Это может быть использовано операционной системой, JVM, микросервисом, который использует наша программа, и т. Д.

Точнее, это пары ключ/значение , где ключ-это то, что можно рассматривать как имя переменной среды, а значение-это, ну, значение. Их значения всегда являются строками.

Когда люди ссылаются на переменные среды, они обычно имеют в виду те, которые установлены операционной системой. Вероятно, в прошлом вам приходилось иметь дело с PATH и JAVA_HOME – это переменные среды.

Переменные среды различаются в разных операционных системах, и иногда бывает сложно создавать переносимые программы, которые полагаются на них, но ничто не делает их по своей сути трудными для работы.

Переменные окружения операционной системы имеют свой аналог в мире JVM – Свойства . Они выходят за рамки этой статьи, но стоит упомянуть, что они являются довольно похожей концепцией в меньшем масштабе.

Читайте также:  Java дата начало дня

Запрос переменных среды

Ваша операционная система хранит свои переменные среды в виде пар ключ/значение. Вы можете использовать System.getenv() для получения этих значений. Если вы используете его без аргумента, вы получите Map объект в качестве возвращаемого значения:

Map env = System.getenv(); for(String envName : env.keySet())

Вот усеченное представление результатов:

PROCESSOR_ARCHITECTURE : AMD64 MIC_LD_LIBRARY_PATH : C:\Program Files (x86)\Common Files\Intel\Shared Libraries\compiler\lib\mic PSModulePath : C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\ SystemDrive : C: AWE_DIR : D:\Awesomium\1.6.6\ FPS_BROWSER_USER_PROFILE_STRING : Default PATHEXT : .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC DriverData : C:\Windows\System32\Drivers\DriverData HerokuPath : E:\Heroku ProgramData : C:\ProgramData ProgramW6432 : C:\Program Files

Вы также можете передать ему Строку , соответствующую имени переменной (ключу), и он вернет значение соответствующей переменной в виде Строки :

System.out.println(System.getenv("NUMBER_OF_PROCESSORS"));

Конструктор процессов и окружающая среда

В Java есть класс Process для работы с процессами операционной системы. Чтобы упростить создание процесса, существует класс ProcessBuilder , и вы можете просто “добавить” команды в его экземпляр для запуска.

Каждый процесс может иметь свою собственную среду. Ваша программа будет иметь свою среду, заданную операционной системой, но программы, которые вы запускаете как процессы, могут иметь измененную “ручную” среду.

Чтобы отредактировать среду, вам необходимо извлечь ее ссылку из вашего объекта ProcessBuilder с помощью environment() getter. Как и при чтении переменных среды из System , вы получите Карту , а затем сможете изменить ее с помощью обычных Map операций.

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

После создания среды мы создадим команду. Это зависит от операционной системы. Здесь у нас есть элементарная проверка, которая адекватно изменяет команду:

// Setting up the environment. ProcessBuilder processBuilder = new ProcessBuilder(); Map env = processBuilder.environment(); env.put("PING_WEBSITE", "stackabuse.com"); if (System.getProperty("os.name").startsWith("Windows")) < processBuilder.command("cmd.exe", "/c", "ping -n 3 %PING_WEBSITE%") >else < processBuilder.command("/bin/bash", "-c", "ping $PING_WEBSITE$"); >try < // Starting the process. Process process = processBuilder.start(); // Reading the output of the process try (BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) < String line; while ((line = reader.readLine()) != null) < System.out.println(line); >> // Catch the exit code of our process int ret = process.waitFor(); System.out.printf("Program exited with code: %d", ret); > catch (IOException | InterruptedException e) < // Handle exception. e.printStackTrace(); >
Pinging stackabuse.com [172.67.218.223] with 32 bytes of data: Reply from 172.67.218.223: bytes=32 time=12ms TTL=57 Reply from 172.67.218.223: bytes=32 time=12ms TTL=57 Reply from 172.67.218.223: bytes=32 time=15ms TTL=57 Ping statistics for 172.67.218.223: Packets: Sent = 3, Received = 3, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 12ms, Maximum = 15ms, Average = 13ms Program exited with code: 0 Process finished with exit code 0

Мы создали новую переменную среды с именем PING_WEBSITE с фиксированным значением. Вы можете изменить эту программу, чтобы задать значение PING_WEBSITE для ввода пользователем, аргумента командной строки или считывания значения из файла.

Если вы хотите прочитать о том , как анализировать и сопоставлять аргументы командной строки в Java или как получить ввод Uset в Java, мы вам поможем!

Вывод

Мы представили концепцию переменных среды, объяснили, для чего они используются, и аналогичные концепции, а также их системно-зависимую природу.

Затем мы напечатали переменные среды с помощью метода Java System.getEnv () , а также создали процессы с помощью ProcessBuilder и выполнили команды, которые зависят от переменных среды.

Читайте ещё по теме:

Источник

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:

import java.util.Map; public class EnvMap < public static void main (String[] args) < Mapenv = System.getenv(); for (String envName : env.keySet()) < System.out.format("%s=%s%n", envName, env.get(envName)); >> >

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.

To maximize portability, never refer to an environment variable when the same value is available in a system property. For example, if the operating system provides a user name, it will always be available in the system property user.name .

Источник

Managing Environment Variables in Java

Variables are named memory locations. Their values are saved in memory, which we can’t typically remember as they’re not human-friendly and shift around. Though, if we name the memory location, such as a , it’s a lot easier to remember.

Environment variables are a lot like usual programming variables, except that they’re set somewhere outside the program. That can be used by the operating system, JVM, a microservice our program is using, etc.

More precisely, they’re key/value pairs, where the key is what can be thought of as the name of the environment variable and value is, well, value. Their values are always strings.

When people refer to environment variables they usually mean those set by the operating system. You’ve likely had to deal with PATH and JAVA_HOME in the past — those are environment variables.

Environment variables vary across operating systems and it can sometimes be tough to make portable programs that rely on them, but nothing is making them inherently difficult to work with.

The operating system’s environment variables have its analog in the JVM world — Properties. They’re beyond the scope of this article, but bear mentioning as they are quite a similar concept at a smaller scale.

Querying Environment Variables

Your operating system stores its environment variables as key/value pairs. You can use System.getenv() to retrieve those values. If you use it without an argument, you’ll get a Map object as the return value:

Map env = System.getenv(); for(String envName : env.keySet())< System.out.println(String.format("%s : %s", envName, env.get(envName))); > 

Here’s a truncated view of the results:

PROCESSOR_ARCHITECTURE : AMD64 MIC_LD_LIBRARY_PATH : C:\Program Files (x86)\Common Files\Intel\Shared Libraries\compiler\lib\mic PSModulePath : C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\ SystemDrive : C: AWE_DIR : D:\Awesomium\1.6.6\ FPS_BROWSER_USER_PROFILE_STRING : Default PATHEXT : .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC DriverData : C:\Windows\System32\Drivers\DriverData HerokuPath : E:\Heroku ProgramData : C:\ProgramData ProgramW6432 : C:\Program Files 

You can also pass it a String corresponding to the variable’s name (key) and it will return the respective variable’s value as a String :

System.out.println(System.getenv("NUMBER_OF_PROCESSORS")); 

ProcessBuilder and Environment

Java has a Process class for dealing with operating system processes. To make it simpler to create a process, there’s a ProcessBuilder class and you can simply «add» commands to its instance to run.

Each process can have its own environment. Your program will have its environment set by the operating system, but programs you start as processes can have a modified «hand-made» environment.

To edit an environment, you have to fetch its reference from your ProcessBuilder object by using the environment() getter. Like with reading environment variables from System , you’ll get a Map and can then modify it with usual Map operations.

Free eBook: Git Essentials

Check out our hands-on, practical guide to learning Git, with best-practices, industry-accepted standards, and included cheat sheet. Stop Googling Git commands and actually learn it!

After creating an environment, we’ll create a command. This depends on the operating system. Here, we have a rudimentary check which alters the command adequately:

// Setting up the environment. ProcessBuilder processBuilder = new ProcessBuilder(); Map env = processBuilder.environment(); env.put("PING_WEBSITE", "stackabuse.com"); if (System.getProperty("os.name").startsWith("Windows")) < processBuilder.command("cmd.exe", "/c", "ping -n 3 %PING_WEBSITE%") > else < processBuilder.command("/bin/bash", "-c", "ping $PING_WEBSITE$"); > try < // Starting the process. Process process = processBuilder.start(); // Reading the output of the process try (BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) < String line; while ((line = reader.readLine()) != null) < System.out.println(line); >> // Catch the exit code of our process int ret = process.waitFor(); System.out.printf("Program exited with code: %d", ret); > catch (IOException | InterruptedException e) < // Handle exception. e.printStackTrace(); > 
Pinging stackabuse.com [172.67.218.223] with 32 bytes of data: Reply from 172.67.218.223: bytes=32 time=12ms TTL=57 Reply from 172.67.218.223: bytes=32 time=12ms TTL=57 Reply from 172.67.218.223: bytes=32 time=15ms TTL=57 Ping statistics for 172.67.218.223: Packets: Sent = 3, Received = 3, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 12ms, Maximum = 15ms, Average = 13ms Program exited with code: 0 Process finished with exit code 0 

We’ve created a new environment variable called PING_WEBSITE with a fixed value. You could modify this program to set the value of PING_WEBSITE to user input, a command-line argument, or read the value from a file.

Conclusion

We have introduced the concept of environment variables, explained what they’re used for and analogous concepts, as well as their system-dependent nature.

Then, we’ve printed the environment variables using Java’s System.getEnv() method, as well as created processes using ProcessBuilder and executed commands that rely on environment variables.

Источник

Оцените статью