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

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

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

Вы можете определить версию в 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} } 

Для этой цели я использую плагин SBT BuildInfo :

 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, что весьма полезно, если ваша assembly становится более сложной.

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

 play.core.PlayVersion.current(); 

Вот как вы можете получить версию приложения и приложение приложения, определенные в файле 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" 

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

ОБНОВИТЬ

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

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

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

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

fyi: Я использую SBT native packager

 addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.3") 
  • Как узнать, какую версию .NET Framework нужно выполнить для исполняемого файла?
  • Ошибка browser.msie после обновления до jQuery 1.9.1
  • Как узнать, какая реализация JAXP используется и откуда она загружена?
  • Сценарий PowerShell для возврата версий .NET Framework на машину?
  • java.lang.UnsupportedClassVersionError: неверный номер версии в .class файле?
  • Есть ли с_fileglob, который работает удаленно в недоступном?
  • Как получить автоматически увеличивающийся номер версии (Visual Studio)?
  • Как определить версию приложения в одном месте для нескольких приложений?
  • Как программно получить версию DLL или EXE-файла?
  • C # если / then директивы для debug vs release
  • Как сделать номера версий?
  • Давайте будем гением компьютера.