如何从Java类访问build.gradle中我的项目的版本

MmM*_*mMm 4 java gradle

我对Gradle还是很陌生,所以答案可能很简单,因此,如果答案很简单,我深表歉意:我有一个测试工具,需要获取其版本并将其与正在测试的应用程序的版本进行比较。但是,我的工具版本在build.graddle中为

 version '1.0' 
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的访问方式(例如):

task generateSources {
File outDir
outDir = file("$buildDir/classes/test/tests/Version.java")
doFirst {
    outDir.exists() || outDir.mkdirs()
    new File(outDir).write("public class Version { public static final String VERSION = \"$project.version\"; }")
 }
}
compileJava.dependsOn generateSources
compileJava.source generateSources.outputs.files, sourceSets.main.java
Run Code Online (Sandbox Code Playgroud)

我发现这段代码将版本输出到另一个Java文件,但是我看不到以后如何检索该信息(我的意思是,我的测试是在src中定义的,因此我需要指向一个文件在编译时不存在-如果我在这里错了,请纠正我)。

关于如何完成此任务的任何想法吗?

Sta*_*lav 5

首先,您尝试在build / classes目录中创建Java源文件(它应该包含编译后的类,而不是源代码),但是您必须在源代码中执行它,否则它将不会被编译。而且,如果您需要这个新类不能用于测试,请使用src/main/java,而不是src/test/java/

但是无论如何,对于您的情况,我认为使用一些属性文件并在构建过程中替换其中的令牌要容易得多。这将允许您在运行构建之前进行一些静态逻辑运算以获得该属性值并使用它。因此,您需要做的是:

1-在您的资源中有一些属性文件src/main/resources(例如app.properties),应该将version变量存储在哪里,其值类似于APP_VERSION_TOKEN

version=%APP_VERSION_TOKEN%
Run Code Online (Sandbox Code Playgroud)

2-配置您的Gradle processResources以替换令牌,如下所示:

processResources {
    filesMatching('**/app.properties') {
        filter {
            it.replace('%APP_VERSION_TOKEN%', version)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3-制定一些方法来读取此文件并返回属性的值,并在需要时使用它。

就这样。对于单元测试,您可以在其下拥有另一个具有相同名称的文件,该文件具有src/test/resource测试所需的不变值。