【问题标题】:How to read value from gradle.properties in java module?如何从 java 模块中的 gradle.properties 读取值?
【发布时间】:2016-02-18 01:09:43
【问题描述】:

我在 Android Studio 中有一个项目,其中包含几个模块。

  • app 模块。与apply plugin: 'com.android.application'
  • androidLibrary 模块。与apply plugin: 'com.android.library'
  • javaLibrary 模块。与apply plugin: 'java'

我想在项目gradle.properties 文件中声明一些变量,并能够从javaLibrary 模块中读取它们。

我已根据this 文档通过以下方式声明了属性...

  • mysuperhost=superhost
  • systemProp.mysuperhost=superhost
  • ORG_GRADLE_PROJECT_mysuperhost=superhost
  • org.gradle.project.mysuperhost=superhost

...并试图以这种方式阅读它们但没有成功:

  • System.getenv("mysuperhost");
  • System.getProperty("mysuperhost");

我知道如何从BuildConfig 类中读取属性,但这是应用模块中生成的类(带有apply plugin: 'com.android.application'),因此这不适用于这种特殊情况。

【问题讨论】:

    标签: java android gradle android-gradle-plugin gradle-plugin


    【解决方案1】:

    如果您的 gradle.properties 文件中有一些价值,例如 mysuperhost=superhost 然后在您的 build.gradle 文件中写入以下行(从 gradle.properties 文件中获取属性并将其添加到 BuildConfig.java 类中):

    // ...
    // ...
    
    android {
        // Just for example
        compileSdkVersion 23
        // Just for example
        buildToolsVersion "23.0.2"
    
        // ...
        // ...
    
        defaultConfig {
            // Just for example
            minSdkVersion 14
            // Just for example
            targetSdkVersion 23
    
            // This is the main idea
            buildConfigField('String', 'MY_SUPER_HOST', "\"${mysuperhost}\"")
    
            // ...
            // ...
        }
    
        // ...
        // ...
    }
    
    // ...
    // ...

    之后构建您的项目,您可以通过 BuildConfig.MY_SUPER_HOST

    使用您的价值

    【讨论】:

    • 谢谢,但这将使BuildConfig 成员可从app 模块获得,我希望gradle 属性可从java 模块获得。我正在研究@Doug 的解决方案。如果有效,将在此处发布。
    【解决方案2】:

    您关于无法使用 BuildConfig 的说法并不完全准确,因为您可以使用 Java 反射找到 BuildConfig 的公共静态成员,只要您知道它的完全限定包。

    假设您生成的 BuildConfig 的完整包名称是 com.company.app.BuildConfig。您可以通过以下方式获取其 Class 对象:

    Class<?> klass = Class.forName("com.company.app.BuildConfig");
    

    然后您可以使用该 Class 对象按名称选择它的字段:

    Field field = klass.getDeclaredField("BUILD_TYPE");
    

    那么你就可以得到它的值了:

    String value = field.get(null);
    

    【讨论】:

    • 当我说我能够读取BuildConfig 成员时,我的意思是我能够从app 模块中读取。我要做的是从java 模块中读取gradle.properties 文件中声明的属性。
    • 好的,所以您想在 gradle 构建期间而不是在应用程序运行时阅读它们?
    • 是的,该属性应该在运行时可用。
    • 你仍然可以使用反射。使用反射 API 的一个重要原因是在运行时从类中挑选出一些东西,而不必针对它们的任何符号进行编译。我更新了答案以更具体地说明这一点。
    • 我一定会试一试的。只是为了确保在继续之前,java 模块是否需要依赖于appmodule?
    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 2021-06-02
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2017-06-08
    相关资源
    最近更新 更多