본문 바로가기
Programming Language 이해하기/Java 이해하기

build.gradle 에서 다양한 방식으로 변수 사용하기.

by simplify-len 2020. 9. 4.

들어가기

다양한 방법들

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"]

 

https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html#getProperties--

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 에서 변수를 사용할 수 있는지 알아봤습니다. 더 다양한 케이스가 있다면, 댓글 부탁드립니다!

댓글