source

Java에서 사용할 수 있는 변수를 Gradle에서 선언할 수 있습니까?

goodcode 2022. 8. 29. 22:08
반응형

Java에서 사용할 수 있는 변수를 Gradle에서 선언할 수 있습니까?

Java에서 사용할 수 있는 Gradle에서 변수를 선언할 수 있습니까?기본적으로 build.gradle에서 변수를 선언하고 빌드 시 (분명히) 가져오기를 원합니다.C/C++의 프리프로세서 매크로와 같이...

선언의 예로는 다음과 같은 것이 있습니다.:

android {
    debug {
        A_VAR_RETRIEVABLE_IN_JAVA = 42
    }
    release {
        A_VAR_RETRIEVABLE_IN_JAVA = 42+52
    }
}

그렇게 할 수 있는 방법이 있나요?

Java에서 사용하기 위해 Gradle에서 값을 전달하는 방법은 다음과 같습니다.

Java 상수 생성

android {
    buildTypes {
        debug {
            buildConfigField "int", "FOO", "42"
            buildConfigField "String", "FOO_STRING", "\"foo\""
            buildConfigField "boolean", "LOG", "true"
        }

        release {
            buildConfigField "int", "FOO", "52"
            buildConfigField "String", "FOO_STRING", "\"bar\""
            buildConfigField "boolean", "LOG", "false"
        }
    }
}

, 「 」를 참조해 주세요.BuildConfig.FOO

Android 리소스 생성

android {
    buildTypes {
        debug{
            resValue "string", "app_name", "My App Name Debug"
        }
        release {
            resValue "string", "app_name", "My App Name"
        }
    }
}

일반적인 방법으로 액세스 할 수 있습니다.@string/app_name ★★★★★★★★★★★★★★★★★」R.string.app_name

Android 응용 프로그램(Java 및 XML)에서 API App Key를 사용하는 예

gradle.properties

AppKey="XXXX-XXXX"

build.gradle

buildTypes {
//...
    buildTypes.each {
        it.buildConfigField 'String', 'APP_KEY_1', AppKey
        it.resValue 'string', 'APP_KEY_2', AppKey
    }
}

자바코드에서의사용방법

Log.d("UserActivity", "onCreate, APP_KEY: " + getString(R.string.APP_KEY_2));

BuildConfig.APP_KEY_1

xml 코드에서의 사용

<data android:scheme="@string/APP_KEY_2" />

build.gradle로 설정된 시스템 속성을 사용하는 예. Java 응용 프로그램에서 읽습니다(댓글의 질문에서 후속 조치).

「」를 합니다.testbuild.gradle method 에서는, 「」를 참조해 주세요systemProperty'CHANGE: 'CHANGE: 'CHANGE: 'CHANGE:

apply plugin: 'java'
group = 'example'
version = '0.0.1-SNAPSHOT'

repositories {
    mavenCentral()
    // mavenLocal()
    // maven { url 'http://localhost/nexus/content/groups/public'; }
}

dependencies {
    testCompile 'junit:junit:4.8.2'
    compile 'ch.qos.logback:logback-classic:1.1.2'
}

test {
  logger.info '==test=='
  systemProperty 'MY-VAR1', 'VALUE-TEST'
}

샘플는 다음과 되어 있습니다합니다.시스템 속성을 가져옵니다.MY-VAR1VALUE-TEST:

package example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  static final Logger log=LoggerFactory.getLogger(HelloWorld.class);
  public static void main(String args[]) {
    log.info("entering main...");
    final String val = System.getProperty("MY-VAR1", "UNSET (MAIN)");
    System.out.println("(main.out) hello, world: " + val);
    log.info("main.log) MY-VAR1=" + val);
  }
}

케이스: 「」의 경우:MY-VAR않은

package example;
...
public class HelloWorldTest {
    static final Logger log=LoggerFactory.getLogger(HelloWorldTest.class);
    @Test public void testEnv() {
        HelloWorld.main(new String[]{});
        final String val = System.getProperty("MY-VAR1", "UNSET (TEST)");
        System.out.println("(test.out) var1=" + val);
        log.info("(test.log) MY-VAR1=" + val);
        assertEquals("env MY-VAR1 set.", "VALUE-TEST", val);
    }
}

실행(주의: 테스트 통과):

$ gradle cleanTest test
:cleanTest
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test

BUILD SUCCESSFUL

로그 에 그 가 표시됩니다또는 run 「」(slf4j+logback).gradle --info cleanTest test; 콘솔에 stdout되는 속성도 있지만, 그 이유는 다음과 같습니다.

$ cat app.log
INFO Test worker example.HelloWorld - entering main...
INFO Test worker example.HelloWorld - main.log) MY-VAR1=VALUE-TEST
INFO Test worker example.HelloWorldTest - (test.log) MY-VAR1=VALUE-TEST

'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아!systemProperty..., 한다.)test들 수 있습니다.

example.HelloWorldTest > testEnv FAILED
    org.junit.ComparisonFailure at HelloWorldTest.java:14

위해 설정(「」)을 .src/test/resources/logback-test.xml

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d %p %t %c - %m%n</pattern>
        </layout>
 </appender>
 <root level="info">
     <appender-ref ref="FILE"/>
</root>
</configuration> 

파일:

  • build.gradle
  • src/main/java/example/HelloWorld.java
  • src/test/java/example/HelloWorldTest.java
  • src/test/resources/logback-test.xml

빌드 중에 시스템 환경 변수를 통해 재정의 가능한 빌드 구성 필드를 생성할 수 있습니다.

폴백은 개발 중에 사용되지만 Jenkins 또는 다른 도구에서 빌드를 실행할 때 변수를 재정의할 수 있습니다.

build.gradle:

buildTypes {
        def serverUrl =  '\"' + (System.getenv("SERVER_URL")?: "http://default.fallback.url.com")+'\"'
        debug{
            buildConfigField "String", "SERVER_URL", serverUrl
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "String", "SERVER_URL", serverUrl
        }
    } 

는 '하다'로 사용할 수 .BuildConfig.SERVER_URL.

rciovati의 답변은 전적으로 옳습니다.build.gradle의 기본 구성 부분에 있는 모든 빌드 유형에 대해 변수를 생성할 수 있는 tidbit을 하나 더 추가하고 싶습니다.이것은 다음과 같습니다.

android {
    defaultConfig {
        buildConfigField "String", "APP_NAME", "\"APP_NAME\""
    }
}

이를 통해 다음과 같은 방법으로 액세스 할 수 있습니다.

BuildConfig.App_NAME

이 시나리오에 대해서도, 공통의 설정을 필요로 하는 경우에 주의해 주세요.

나는 이 코드를 사용하고 있고 매우 잘 작동합니다.

def baseUrl = '\"http://patelwala.com/myapi/"'
def googleServerKey = '\"87171841097-opu71rk2ps35ibv96ud57g3ktto6ioio.apps.googleusercontent.com"'
android {
  buildTypes {
  release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField 'String', 'BASE_URL', baseUrl
        buildConfigField 'String', 'web_client_id', googleServerKey
    }
    releasedebug {
        initWith debug
        buildConfigField 'String', 'BASE_URL', baseUrl
        buildConfigField 'String', 'web_client_id' ,googleServerKey
    }
    debug {

        buildConfigField 'String', 'BASE_URL', baseUrl
        buildConfigField 'String', 'web_client_id', googleServerKey
    }
 }
}

}

위의 답변 중 어느 것도 지침을 주지 않았기 때문에 Groovy Methods에 대해 2시간 동안 배워야 했습니다.

저는 프로덕션, 샌드박스, 그리고 지역 환경에 역행할 수 있기를 바랐습니다.귀찮아서 URL을 한 곳에서만 바꾸고 싶었어요.제가 생각해낸 것은 다음과 같습니다.

 flavorDimensions 'environment'
    productFlavors {
        production {
            def SERVER_HOST = "evil-company.com"
            buildConfigField 'String', 'API_HOST', "\"${SERVER_HOST}\""
            buildConfigField 'String', 'API_URL', "\"https://${SERVER_HOST}/api/v1/\""
            buildConfigField 'String', 'WEB_URL', "\"https://${SERVER_HOST}/\""
            dimension 'environment'
        }
        rickard {
            def LOCAL_HOST = "192.168.1.107"
            buildConfigField 'String', 'API_HOST', "\"${LOCAL_HOST}\""
            buildConfigField 'String', 'API_URL', "\"https://${LOCAL_HOST}/api/v1/\""
            buildConfigField 'String', 'WEB_URL', "\"https://${LOCAL_HOST}/\""
            applicationIdSuffix ".dev"
        }
    }

대체 구문: 사용할 수 있는 것은${variable}그루비 메서드에 큰따옴표로 묶어서.

    rickard {
        def LOCAL_HOST = "192.168.1.107"
        buildConfigField 'String', 'API_HOST', '"' + LOCAL_HOST + '"'
        buildConfigField 'String', 'API_URL', '"https://' + LOCAL_HOST + '/api/v1/"'
        buildConfigField 'String', 'WEB_URL', '"https://' + LOCAL_HOST + '"'
        applicationIdSuffix ".dev"
    }

제가 이해하기 어려웠던 것은 끈은 따옴표로 둘러싸인 끈으로 선언해야 한다는 것이었습니다.그 제한 때문에 레퍼런스를 사용할 수 없었습니다.API_HOST애초에 제가 하고 싶었던 일이었어요

사용하고 있다

buildTypes.each {
    it.buildConfigField 'String', 'GoogleMapsApiKey', "\"$System.env.GoogleMapsApiKey\""
}

그것은 데니스의 대답에 기초하지만 환경변수로부터 얻은 것이다.

함수의 문자열 결과를 buildConfigField에 삽입하려면 어떻게 해야 합니까?

다음은 사람이 읽을 수 있는 형식의 빌드 날짜 예제입니다.

def getDate() {
    return new SimpleDateFormat("dd MMMM yyyy", new Locale("ru")).format(new Date())
}

def buildDate = getDate()

defaultConfig {
    buildConfigField "String", "BUILD_DATE", "\"$buildDate\""
}

https://stackoverflow.com/a/17201265/12021422 @rciovati works의 답변

Android Studio IDE에서 오류를 제거할 수 있도록 프로젝트를 재구성하십시오.

왜 새로운 부동산 변수에 접근할 수 없는지 알아보려고 30분이나 걸렸어요.

빨간색으로 표시된 "프로젝트 만들기"가 작동하지 않으면 녹색으로 표시된 "프로젝트 재구성" 버튼을 사용해 보십시오.

여기에 이미지 설명 입력

이것은 Java와 Kotlin에서 모두 사용할 수 있는 Kotlin DSL(build.gradle.kts)용입니다.

buildTypes {
    getByName("debug") {
        buildConfigField("Boolean", "isHappy", "true")
        buildConfigField("String", "favoriteSong", """"Black Forest"""")
        resValue("string", "myName", "Lind")
    }
}

언급URL : https://stackoverflow.com/questions/17197636/is-it-possible-to-declare-a-variable-in-gradle-usable-in-java

반응형