Play Framework 2: прочитайте версию приложения, определенную в Build.scala
Я использую Play Framework 2.0 (2.0.3).
У меня есть проект Java и вы хотите прочитать версию приложения (appVersion
), определенную в Build.scala.
То, что я уже видел, - это возможность считывать определенные детали конфигурации из объекта Application
, предоставленного Global.java, но не нашел ключа под названием appVersion или аналогичного.
Ответы
Ответ 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")