Gradle:为Java提供构建版本

Ala*_*n47 9 java build version gradle

默认情况下,所有gradle java项目都有一个version属性.通常,这看起来像:

allprojects {
    apply plugin: 'java'
    // ...

    // configure the group and version for this project
    group = 'org.example'
    version = '0.2-SNAPSHOT'
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使这里定义的"版本"属性可用于构建的Java代码?我想拥有的是这个项目中的类:

public class BuildVersion {

    public static String getBuildVersion(){
        return // ... what was configured in gradle when project was built
    }

}
Run Code Online (Sandbox Code Playgroud)

我想这可以通过某种源代码生成来完成.或者让gradle将变量写入某种配置文件中src/main/resources.在Gradle中有"标准"(即普遍接受的)方式吗?

And*_*eas 26

假设你的摇篮脚本插入version到JAR清单正确,如图所示在这里:

version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version
    }
}
Run Code Online (Sandbox Code Playgroud)

您的代码将能够从该jar清单文件中获取该版本:

public class BuildVersion {

    public static String getBuildVersion(){
        return BuildVersion.class.getPackage().getImplementationVersion();
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,编写Gradle任务以创建包含其中版本的属性文件,并将该生成的属性文件包含在jar文件中,然后使用该文件访问它getResouceAsStream().

您当然也可以BuildVersion.java从Gradle任务生成文件,并将版本直接嵌入为字符串文字,并确保任务在任务之前运行compile.

但我建议只使用你将要包含的版本号(清单文件),它完全支持Gradle写入它和Java Runtime读取它,没有任何自定义Gradle任务或Java文件读取.

  • 确保该包仅位于一个 jar 中:/sf/ask/2674284161/ #47442055 (2认同)
  • IntelliJ 抱怨“build.gradle”中的“version”已被弃用,并且更喜欢“project.version”。 (2认同)
  • 多年来,这个答案对我帮助很大。然而,有一点警告:并非所有包装变体实际上都会包含“MANIFEST.MF”文件。特别是在“无服务器”世界中,或者在构建无发行容器时,打包通常是不同的,并且不一定首先涉及构建“*.jar”文件。在这种情况下,包含“build.properties”文件作为资源而不是使用“MANIFEST.MF”可能会更明智。 (2认同)