Как получить атрибут версии из сборки gradle для включения в приложение runtime 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 поддержать его поможет.

4 ответов


Мне нравится создавать файл свойств во время сборки. Вот способ сделать это из 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
}

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

getClass().getPackage().getImplementationVersion()

проблема в том, что это будет работать, только если вы запустите приложение из сгенерированного jar - если вы запустите его непосредственно из IDE/расширенных классов, getPackage выше вернет null. Это достаточно хорошо для многих случаев - просто отобразите "развитие", если вы запускаете из IDE (geting null package) и будете работать для фактического развертывание клиентов.


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

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

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


более простое и обновленное решение @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
}