在Java中,是否可以在Gradle中声明一个变量?

来源:互联网 发布:qq影音windows版电脑版 编辑:程序博客网 时间:2024/05/29 12:46

(转载)https://gxnotes.com/article/23313.html

问题描述

是否可以在Java中声明一个可用于Gradle的变量?基本上我想在build.gradle中声明一些vars,然后在构建时得到它(显然)。就像在C /C++中的pre-processor宏…

声明的一个例子就是这样:

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

有办法做这样的事吗?

最佳解决方案

生成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_nameR.string.app_name以常规方式访问它们

次佳解决方案

Android应用程序中的Api应用程序键(Java和XML)的使用示例

AppKey="XXXX-XXXX"

的build.gradle

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

在java代码中使用

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

在xml代码中的用法

<data android:scheme="@string/APP_KEY_2" />
  • Link to an example of Api App Key usage in an Android application

  • Using String Constants Generated by Gradle Build Configurations

第三种解决方案

使用系统属性的示例,在build.gradle中设置,从Java应用程序读取(从注释中的问题开始):

基本上,在build.gradle中使用test任务,使用测试任务方法systemProperty设置在运行时传递的系统属性:

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,预计在run-time被设置为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:testBUILD SUCCESSFUL

我发现棘手的部分实际上是从gradle获取输出…所以在这里配置日志记录(slf4j + logback),日志文件显示结果(或者,运行gradle --info cleanTest test;还有属性可以得到stdout到控制台,但是,你知道为什么):

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

如果您注释掉“systemProperty...”(其中btw仅适用于test任务),则:

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

为了完整,这里是logback配置(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

参考文献

  • Is it possible to declare a variable in Gradle usable in Java?

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。