Как получить атрибут версии из сборки gradle для включения в приложение Swing для выполнения

У меня есть простой родительский проект с модулями/приложениями внутри него. Мой выбор для сборки - gradle. Родитель build.gradle определяется ниже.

apply plugin: 'groovy'
dependencies {
    compile gradleApi()
    compile localGroovy()
}


allprojects {
    repositories {
        mavenCentral()
    }

    version "0.1.0-SNAPSHOT"
}

Что бы я хотел сделать, это использовать атрибут версии (0.1.0-SNAPSHOT) в моем приложении swing. В частности, я бы хотел, чтобы он отображался в заголовке основного JFrame. Я ожидаю, что смогу сделать что-то вроде this.setTitle("My Application - v." + ???.version);

Приложение представляет собой простой Java-проект, но я не против добавления поддержки groovy, это поможет.

Ответ 1

Мне нравится создавать файл свойств во время сборки. Вот как это сделать непосредственно из Gradle:

task createProperties(dependsOn: processResources) {
  doLast {
    new File("$buildDir/resources/main/version.properties").withWriter { w ->
        Properties p = new Properties()
        p['version'] = project.version.toString()
        p.store w, null
    }
  }
}

classes {
    dependsOn createProperties
}

Ответ 2

Вы всегда можете использовать грубую силу, поскольку кто-то предложил и генерирует файл свойств во время сборки. Более элегантный ответ, который работает только частично, будет заключаться в использовании

getClass().getPackage().getImplementationVersion()

Проблема в том, что это будет работать только при запуске приложения из сгенерированного jar - если вы запустите его непосредственно из IDE/расширенных классов, getPackage выше вернет значение null. Это достаточно хорошо для многих случаев - просто покажите "РАЗРАБОТКА", если вы запустите из IDE (получите нулевой пакет) и будете работать для фактических развертываний клиентов.

Ответ 3

Лучшая идея - сохранить версию проекта в файле gradle.properties. Все свойства этого файла будут автоматически загружены и могут использоваться в build.gradle script.

Затем, если вам нужна версия в вашем приложении swing, добавьте файл version.properties в папку src/main/resources и отфильтруйте этот файл во время сборки приложения, здесь - это сообщение, в котором показано, как это сделать.

version.properties будет включен в финальную банку, поэтому ее можно прочитать и через ClassLoader, а свойства из этого файла могут быть отображены в приложении.

Ответ 4

Упрощенное и обновленное решение @Craig Trader (готово к Gradle 4.0/5.0)

task createProperties {
    doLast {
        def version = project.version.toString()
        def file = new File("$buildDir/resources/main/version.txt")
        file.write(version)
    }
}

war {
    dependsOn createProperties
}