자바 System.getProperty 대 System.getenv

1. 소개

java.lang 패키지 는 Java 애플리케이션에서 자동으로 가져 옵니다 . 이 패키지에는 NullPointerException 에서 Object , MathString 까지 일반적으로 사용되는 많은 클래스가 포함되어 있습니다 .

에 java.lang.System 클래스는 것입니다 최종 그러므로 우리는 모든 방법은, 그것을 서브 클래스 수 없음을 의미 클래스 의 정적 .

시스템 속성과 환경 변수읽는 두 가지 시스템 메서드 의 차이점을 살펴 보겠습니다 .

이러한 메소드는 getPropertygetenv 입니다.

2. System.getProperty () 사용

Java 플랫폼은 Properties 객체를 사용 하여 로컬 시스템 및 구성에 대한 정보 를 제공하며 이를 System Properties 라고합니다 .

시스템 속성에는 현재 사용자, Java 런타임의 현재 버전 및 파일 경로 이름 구분 기호와 같은 정보가 포함됩니다.

아래 코드에서는 System.getProperty (“log_dir”) 를 사용하여 log_dir 속성의 값을 읽습니다 . 또한 기본값 매개 변수를 사용하므로 속성이 존재하지 않으면 getProperty/ tmp / log를 반환합니다 .

String log_dir = System.getProperty("log_dir","/tmp/log"); 

런타임에 시스템 속성을 업데이트하려면 System.setProperty 메서드를 사용합니다 .

System.setProperty("log_dir", "/tmp/log");

다음 형식 의 propertyName 명령 줄 인수를 사용하여 자체 속성 또는 구성 값을 응용 프로그램에 전달할 수 있습니다 .

java -jar jarName -DpropertyName=value

app.jar에서 bar 값으로 foo 속성 설정 :

java -jar app -Dfoo="bar"

System.getProperty 는 항상 String을 반환합니다 .

3. System.getenv () 사용

환경 변수는 속성 과 같은 키 / 값 쌍 입니다. 많은 운영 체제에서 환경 변수를 사용하여 구성 정보를 응용 프로그램에 전달할 수 있습니다.

환경 변수를 설정하는 방법은 운영 체제마다 다릅니다. 예를 들어 Windows에서는 제어판에서 시스템 유틸리티 응용 프로그램을 사용하고 Unix에서는 셸 스크립트를 사용합니다.

프로세스를 생성 할 때 기본적으로 부모 프로세스의 복제 환경을 상속합니다.

다음 코드 조각은 람다 식을 사용하여 모든 환경 변수를 인쇄하는 방법을 보여줍니다.

System.getenv().forEach((k, v) -> { System.out.println(k + ":" + v); }); 

getenv () 는 읽기 전용 맵을 반환합니다 . 지도에 값을 추가하려고하면 UnsupportedOperationException이 발생 합니다.

단일 변수를 얻으려면 변수 이름으로 getenv 를 호출 하십시오.

String log_dir = System.getenv("log_dir");

다른 한편으로, 우리는 우리의 응용 프로그램에서 다른 프로세스를 만들고 그 환경에 새로운 변수를 추가 할 수 있습니다.

Java에서 새 프로세스를 생성하기 위해 environment 라는 메소드가있는 ProcessBuilder 클래스를 사용 합니다 . 이 메소드는 Map을 반환 하지만 이번에는지도가 읽기 전용이 아니므로 요소를 추가 할 수 있습니다.

ProcessBuilder pb = new ProcessBuilder(args); Map env = pb.environment(); env.put("log_dir", "/tmp/log"); Process process = pb.start();

4. 차이점

둘 다 본질적으로 문자열 키에 문자열 값을 제공하는 맵이지만 몇 가지 차이점을 살펴 보겠습니다.

  1. 환경 변수는 운영 체제 변수의 변경 불가능한 복사 본인 동안 런타임에 속성을 업데이트 할 수 있습니다.
  2. 속성은 Java 플랫폼에만 포함되지만 환경 변수는 운영 체제 수준에서 전역 적이며 동일한 시스템에서 실행되는 모든 응용 프로그램에서 사용할 수 있습니다.
  3. 응용 프로그램을 패키징 할 때 속성이 있어야하지만 거의 모든 지점에서 운영 체제에 환경 변수를 만들 수 있습니다.

5. 결론

개념적으로는 유사하지만 속성 및 환경 변수의 적용은 상당히 다릅니다.

옵션 사이의 선택은 종종 범위의 문제입니다. 환경 변수를 사용하면 동일한 애플리케이션을 여러 머신에 배포하여 서로 다른 인스턴스를 실행할 수 있으며 운영 체제 수준이나 AWS 또는 Azure 콘솔에서도 구성 할 수 있습니다. 구성을 업데이트하기 위해 애플리케이션을 다시 빌드 할 필요가 없습니다.

항상 기억 getProperty에이 낙타의 경우 규칙을 다음과 GetEnv를 하지 않습니다.