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 응용 프로그램에서 읽습니다(댓글의 질문에서 후속 조치).
「」를 합니다.test의 build.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-VAR1 시 VALUE-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.gradlesrc/main/java/example/HelloWorld.javasrc/test/java/example/HelloWorldTest.javasrc/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
'source' 카테고리의 다른 글
| 문자열 보간 Vue js (0) | 2022.08.29 |
|---|---|
| 계산된 속성 집합이 Vue에서 호출되지 않음 (0) | 2022.08.29 |
| Java에서는 어레이가 값으로 전달됩니까, 참조로 전달됩니까? (0) | 2022.08.29 |
| Function pointer를 사용하면 프로그램이 느려집니까? (0) | 2022.08.29 |
| VueJS 계산 데이터를 소품으로 전달하면 정의되지 않은 상태로 반환됨 (0) | 2022.08.29 |
