在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_name
或R.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(#替换为@)。
- 在Java中,是否可以在Gradle中声明一个变量?
- 为什么在类中可以声明这个类的变量?
- 现在才知道Java中变量声明可以放在赋值后面。。。
- 在select 中声明变量
- 是否可以在static环境中访问非static变量?
- 是否可以在static环境中访问非static变量
- 在一个类的函数中声明static变量是个啥
- 实现js中判断一个变量是否在数据中
- js javascript 判断一个变量是否在一个数组中
- C++模板中声明和定义是否可以分开存放在.h和.cpp文件中
- 在Js中是否可以遍历一个字符串?
- 在shell中如何判断一个变量是否为空
- 在shell中如何判断一个变量是否为空
- 在shell中如何判断一个变量是否为空
- 在PHP中判断一个变量是否为整数
- Java中接口是否可以包含变量
- 在java中声明数组
- Dialog对象在activity中如果声明为局部变量,则可以被回收
- 数据库设计技巧
- 获取线程结束代码(Exit Code)
- POJ 3278(bfs)
- 笔试题4——数组中第二大的数
- QPBOC交易流程详解--POS与卡片的数据交互进行分析
- 在Java中,是否可以在Gradle中声明一个变量?
- a标签有左右padding(没有上下padding)
- 求回归方程
- 计蒜客————大钉骑马走江湖
- swipebox——一款点击小图浏览大图的jquery插件
- Maven使用攻略
- JAVA泛型的简单思考
- UWA两周年福利帖 | 给你一个暑“价”,回归小清新的性能!
- eclipse中vm文件样式修改