들어가기
다양한 방법들
build.gradle 에서 변수를 사용하는 방식은 아래와 같습니다.
사실 위 System.xxx 의 경우 gradle에서 제공하기 보다는 Java에서 제공한다는 말이 맞습니다. 그러나 제목과 같이 build.gradle 에서 사용하는 방법이므로, 포함시키겠습니다.
task printTask(){
println(System.getenv("X_USER"))
println(project.getProperties()["X_USER"])
println(System.getProperty("X_USER"))
}
> "xxx" ./gradlew printTask "xxx"
여기서 xxx 하는 것에 따라서 변수를 다르게 넣을 수 있습니다.
System.getenv("X-USER")
// 시스템의 환경변수를 가져와서 작업할 경우.
System.getenv("X-USER")
/**
* Gets the value of the specified environment variable. An
* environment variable is a system-dependent external named
* value.
*
* <p>If a security manager exists, its
* {@link SecurityManager#checkPermission checkPermission}
* method is called with a
* <code>{@link RuntimePermission}("getenv."+name)</code>
* permission. This may result in a {@link SecurityException}
* being thrown. If no exception is thrown the value of the
* variable <code>name</code> is returned.
*
* <p><a name="EnvironmentVSSystemProperties"><i>System
* properties</i> and <i>environment variables</i></a> are both
* conceptually mappings between names and values. Both
* mechanisms can be used to pass user-defined information to a
* Java process. Environment variables have a more global effect,
* because they are visible to all descendants of the process
* which defines them, not just the immediate Java subprocess.
* They can have subtly different semantics, such as case
* insensitivity, on different operating systems. For these
* reasons, environment variables are more likely to have
* unintended side effects. It is best to use system properties
* where possible. Environment variables should be used when a
* global effect is desired, or when an external system interface
* requires an environment variable (such as <code>PATH</code>).
*
* <p>On UNIX systems the alphabetic case of <code>name</code> is
* typically significant, while on Microsoft Windows systems it is
* typically not. For example, the expression
* <code>System.getenv("FOO").equals(System.getenv("foo"))</code>
* is likely to be true on Microsoft Windows.
*
* @param name the name of the environment variable
* @return the string value of the variable, or <code>null</code>
* if the variable is not defined in the system environment
* @throws NullPointerException if <code>name</code> is <code>null</code>
* @throws SecurityException
* if a security manager exists and its
* {@link SecurityManager#checkPermission checkPermission}
* method doesn't allow access to the environment variable
* <code>name</code>
* @see #getenv()
* @see ProcessBuilder#environment()
*/
public static String getenv(String name) {
SecurityManager sm = getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("getenv."+name));
}
return ProcessEnvironment.getenv(name);
}
> X_USER=AAA ./gradlew printTask
중요한 부분은 X-USER 로 하면 안된다. Dash가 아닌 UNDER-HYPEN 으로 해야 한다.
System.getProperty("X-USER")
/**
* Gets the system property indicated by the specified key.
* <p>
* First, if there is a security manager, its
* <code>checkPropertyAccess</code> method is called with the key as
* its argument. This may result in a SecurityException.
* <p>
* If there is no current set of system properties, a set of system
* properties is first created and initialized in the same manner as
* for the <code>getProperties</code> method.
*
* @param key the name of the system property.
* @return the string value of the system property,
* or <code>null</code> if there is no property with that key.
*
* @exception SecurityException if a security manager exists and its
* <code>checkPropertyAccess</code> method doesn't allow
* access to the specified system property.
* @exception NullPointerException if <code>key</code> is
* <code>null</code>.
* @exception IllegalArgumentException if <code>key</code> is empty.
* @see #setProperty
* @see java.lang.SecurityException
* @see java.lang.SecurityManager#checkPropertyAccess(java.lang.String)
* @see java.lang.System#getProperties()
*/
public static String getProperty(String key) {
checkKey(key);
SecurityManager sm = getSecurityManager();
if (sm != null) {
sm.checkPropertyAccess(key);
}
return props.getProperty(key);
}
> ./gradlew printTask -DX-USER=HONEYBEAR -DX-USER2=likelen
project.getProperties()["X-USER"]
gradle 에서 변수를 사용할 때 project.getProperties()["X-USER"] 를 사용합니다.
이때, project.getProperties()["X-USER"] 는 gradle.properties 라는 파일을 생성하고 그 안에
X-USER="LEN" 입력하면 사용 가능합니다.
왜 사용하는가?
사용해야 되는 경우는 찾아보면 다양할지 모르나, 적어도 제가 알고 있는 케이스의 경우는 다음과 같습니다.
1. System.getenv("X_USER") 경우, 오픈소스 코드상에 노출되고 싶지 않는 변수를 노출을 가릴 때 사용할 수 있습니다. 특히, 환경변수로서 저장하는 것을 예시를 들 수 있습니다. 환경변수는 원도우를 쓰는 분들이라면 JAVA_HOME을 설정을 하실 때 많이 겪어 봤을 거라 생각합니다 .
또는 GPG Key 를 시스템 내부에 저장하고, 사용할 때도 사용할 수 있습니다.
2. System.getProperty("X-USER") 경우, 시스템 내부에 저장된 것이 아니라, args로 넘겨주기 위한 용도로 사용됩니다. 유저의 정보를 넘기거나, 필요한 api-key를 command-line으로 넘길 때 사용할 수 있습니다.
3. project.getProperties()["X-USER"] 사실 Spring framework 에서 많이 발견할 수 있는 부분인데, gradle의 프로젝트의 버전을 관리할 때 사용합니다.
그 외로 사용하는 경우가 있다면 댓글로 부탁드립니다.
마무리
어떻게 build.gradle 에서 변수를 사용할 수 있는지 알아봤습니다. 더 다양한 케이스가 있다면, 댓글 부탁드립니다!
'Programming Language 이해하기 > Java 이해하기' 카테고리의 다른 글
자바의 리플렉션(Reflection)을 코드와 함께 이해하기 (0) | 2020.09.16 |
---|---|
자바의 직렬화(serialization)를 코드와 함께 이해하기 (0) | 2020.09.16 |
Java에서 Jar 와 War 와 의 차이는 무엇일까? (0) | 2020.08.24 |
Spring5 를 왜 사용해야되는건가?(with Tody Lee) (0) | 2020.08.23 |
자바8 inAction - [12] 새로운날짜와시간API (0) | 2019.08.31 |
댓글