Подтвердить что ты не робот

Play Framework 2: прочитайте версию приложения, определенную в Build.scala

Я использую Play Framework 2.0 (2.0.3). У меня есть проект Java и вы хотите прочитать версию приложения (appVersion), определенную в Build.scala.

То, что я уже видел, - это возможность считывать определенные детали конфигурации из объекта Application, предоставленного Global.java, но не нашел ключа под названием appVersion или аналогичного.

4b9b3361

Ответ 1

Вы можете определить версию в application.conf и Build.scala прочитать значение. Я сделал это с номером версии и именем приложения. В Play 2.0 работает следующее обновление: для Play 2.1.

В project/Build.scala загрузите конфигурацию и получите свойства:

val conf = play.api.Configuration.load(new File("."))
val appName    = conf.getString("app.name").getOrElse("unnamed application")
val appVersion = conf.getString("app.version").getOrElse("0.0.0")

В conf/application.conf определите свойства:

app.version = 1.0
app.name = My Application

Наконец, в вашем приложении он будет доступен с помощью

 Play.application().configuration().getString("app.version")

Синтаксис конфигурации имеет некоторые особенности, поэтому вы можете даже немного сходить с ума от своих версий или имен приложений:

app {
  major    = 1
  minor    = 2
  revision = 3
  version = ${app.major}.${app.minor}.${app.revision}
  name = My Application ${app.major}.${app.minor}
}

Ответ 2

Я использую SBT BuildInfo plugin для этой цели:

import sbtbuildinfo.Plugin._

val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings = Defaults.defaultSettings ++ buildInfoSettings).settings(

  buildInfoKeys := Seq[Scoped](name, appVersion, scalaVersion, sbtVersion),
  buildInfoPackage := "org.foo.bar",

  ...

)

Это генерирует объект org.foo.bar.BuildInfo, который вы можете вызвать из исходного кода:

org.foo.bar.BuildInfo.version

Вы также можете определить пользовательские ключи в сборке и добавить их в buildInfoKeys, что весьма полезно, если ваша сборка становится более сложной.

Ответ 3

Вы можете получить текущую версию Play, используя:

play.core.PlayVersion.current();

Ответ 4

Вот как вы можете получить версию и имя приложения для Play, определенные в build.sbt

name := "myApp"
version :="1.0.4" 

Обратите внимание, что это работает только в режиме PROD. В режиме dev SBT использует экземпляр JVM с приложением, и эти вызовы возвращают что-то другое.

Application.class.getPackage().getImplementationTitle());     // returns "myApp"
Application.class.getPackage().getImplementationVersion());    // returns "1.0.4"

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

UPDATE

Я заметил, что этот метод не работает из коробки для Play >= 2.4.x

Чтобы устранить проблему, добавьте это в свой файл build.sbt

packageOptions += Package.ManifestAttributes(
  "Implementation-Version" -> (version in ThisBuild).value,
  "Implementation-Title" -> name.value
)

Два свойства будут добавлены в файл MANIFEST.FM в вашей сборке, чтобы заголовок и версия пакета могли быть прочитаны из кода.

fyi: Я использую собственный пакет-загрузчик SBT

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.3")