Best approach to upgrade a large play 2.1.x project to latest 2.5.x release?

90 views
Skip to first unread message

malik dul

unread,
Mar 2, 2017, 7:23:04 AM3/2/17
to Play Framework
Hi All,

I'm a Java developer and need help to upgrade a large project written in Java using old play version 2.1.5.. to latest version of the play. I should mention that I'm new to play and to this project, I was able to do following :
  • Update the project play version and all the dependencies versions to latest in the sbt file.
  • Integrated spring framework DI using play-spring-loader (https://github.com/remithieblin/play-spring-loader)
    • Play-Spring loader needs following config enteries:
      play.application.loader = com.actimust.play.spring.SpringApplicationLoader
      play.bindings.disabled += play.api.libs.Crypto (see last exception)

  • After these updates there were tons of compilation Errors and was able to fix those ( project code compile errors were related to API changes in different versions of play, some play api are deprecated now. e.g play, akka packages and Java 8 api upgrades)

Now when hit localhost:9000 from browser getting run-time exceptions in play and 3rd party libraries e.g. deadbolt, pac4j and others. Most runtime exceptions are DI related and are random in nature.


play.api.UnexpectedException: Unexpected exception[UnsatisfiedDependencyException: Error creating bean with name 'interface be.objectify.deadbolt.java.cache.PatternCache': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'play.cache.CacheApi' available: expected single matching bean but found 2: interface play.cache.CacheApi,interface play.cache.CacheApi qualified with QualifierInstance(@play.cache.NamedCache(value=play))]
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:180)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131)
    at scala.Option.map(Option.scala:146)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129)
    at scala.util.Success.flatMap(Try.scala:231)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:129)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:121)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'interface be.objectify.deadbolt.java.cache.PatternCache': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'play.cache.CacheApi' available: expected single matching bean but found 2: interface play.cache.CacheApi,interface play.cache.CacheApi qualified with QualifierInstance(@play.cache.NamedCache(value=play))
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)



-------------------------------------------------------------------- another one --------------------------------------------------------------------------------


play.api.UnexpectedException: Unexpected exception[UnsatisfiedDependencyException: Error creating bean with name 'class play.api.db.evolutions.DynamicEvolutions': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'class play.db.ebean.DefaultEbeanConfig$EbeanConfigParser': Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'play.Environment' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}]
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:180)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131)
    at scala.Option.map(Option.scala:146)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129)
    at scala.util.Success.flatMap(Try.scala:231)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:129)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:121)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'class play.api.db.evolutions.DynamicEvolutions': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'class play.db.ebean.DefaultEbeanConfig$EbeanConfigParser': Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'play.Environment' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1154)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1056)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'class play.db.ebean.DefaultEbeanConfig$EbeanConfigParser': Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'play.Environment' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1154)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1056)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'play.Environment' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1474)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1102)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1064)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1154)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1056)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)



-------------------------------------------------------------------- another one --------------------------------------------------------------------------------


play.api.UnexpectedException: Unexpected exception[UnsatisfiedDependencyException: Error creating bean with name 'class play.libs.Crypto': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'play.api.libs.Crypto' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}]
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:180)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131)
    at scala.Option.map(Option.scala:146)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129)
    at scala.util.Success.flatMap(Try.scala:231)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:129)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:121)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'class play.libs.Crypto': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'play.api.libs.Crypto' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'play.api.libs.Crypto' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)







I posted question to deadbolt forum /mailing list and admin (Steve Chaloner) was kind enough to provide help, he pointed out few other issues also, so I'm here to ask few basic questions:


  1. If there are libraries replaced by other libraries in different versions of play? (thanks Steve Chaloner for pointing out that BoneCP has been replaced by HikariCP and read somewhere in play docs it can still be used by setting "play.db.pool = bonecp" in conf file)
  2. How to resolve runtime issues?  ( If there are errors / wrong project setup etc. in following project files)
  3. Documents, resources you know can help in this process, especially code samples
  4. Any other info that can help smooth the upgrade process :)
  5. Share your experience if you've done it before, any pitfalls?

Note: I'm reading migration guides here and those helped me a lot to fix compilation errors and as I mentioned I'm new to play, I'm sure I'll be making mistakes, and migration guides are in series like 2.0.x to 2.1 to 2.2 ... to 2.5.x and hard to follow for me at least.




Here are the project files:


--------------------------------build.sbt--------------------------------

name := """project Name"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file("."))
.enablePlugins(PlayJava, PlayEbean)
.aggregate(ccdUniverse, emailNotification, SoapClient, mailClient, XDM, PortalExceptions, readyClient)
.dependsOn(ccdUniverse, emailNotification, SoapClient, mailClient, XDM, PortalExceptions, readyClient)

scalaVersion := "2.11.8"

resolvers += "fdvsolution.public" at "http://nexus.fdvs.com.ar/content/groups/public/"
resolvers += "Jaspersoft Third Party Repository" at "http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/"
resolvers += "Sonatype OSS Maven SNAPSHOT Repository" at "https://oss.sonatype.org/content/repositories/snapshots/"
resolvers += "Sonatype Nexus Respositories" at "https://oss.sonatype.org/content/repositories/"
resolvers += Resolver.url("Objectify Play Repository", url("http://schaloner.github.com/releases/"))(Resolver.ivyStylePatterns)
resolvers += Resolver.url("Objectify Play Snapshot Repository", url("http://schaloner.github.com/snapshots/"))(Resolver.ivyStylePatterns)
resolvers += "Jasper" at "https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports"
resolvers += "json" at "http://maven.jahia.org/maven2"
resolvers += "birt-runtime-codec" at "https://mvnrepository.com/artifact/org.eclipse.birt.runtime.3_7_1/org.apache.commons.codec"
resolvers += "birt-runtime-resources" at "https://mvnrepository.com/artifact/org.eclipse.birt.runtime/org.eclipse.core.resources"

libraryDependencies ++= Seq(
javaJdbc,
cache,
javaWs,
javaCore,
javaJdbc,
"mysql" % "mysql-connector-java" % "5.1.40",
"javax.persistence" % "persistence-api" % "1.0.2",
"redis.clients" % "jedis" % "2.9.0",
"org.jdom" % "jdom2" % "2.0.6",
"jaxen" % "jaxen" % "1.1.6",
"com.google.code.gson" % "gson" % "2.8.0",
"org.apache.commons" % "commons-pool2" % "2.4.2",
"be.objectify" %% "deadbolt-java" % "2.5.4" exclude("cache", "cache"),
"net.sf.jasperreports" % "jasperreports" % "6.4.0",
"org.apache.activemq" % "activemq-core" % "5.7.0",

"junit" % "junit" % "4.12" % "test",
"org.mockito" % "mockito-core" % "2.7.0" % "test",

"redis.clients" % "jedis" % "2.9.0",
"org.jdom" % "jdom2" % "2.0.6",
"jaxen" % "jaxen" % "1.1.6",
"com.google.code.gson" % "gson" % "2.8.0",
"org.apache.commons" % "commons-pool2" % "2.4.2",
"org.eclipse.jdt" % "core" % "3.3.0-v_771",
"org.eclipse.tycho" % "org.eclipse.jdt.core" % "3.9.1.v20130905-0837",
"org.eclipse.core" % "runtime" % "3.9.100-v20131218-1515",
"org.eclipse.birt.runtime" % "org.eclipse.core.resources" % "3.9.1.v20140825-1431",
"org.eclipse.birt.runtime.3_7_1" % "org.apache.commons.codec" % "1.3.0",
"org.apache.axis" % "axis" % "1.4",
"javax.xml" % "jaxrpc" % "1.1",
"org.apache.directory.studio" % "org.apache.commons.io" % "2.4",
"joda-time" % "joda-time" % "2.9.7",
"com.jayway.restassured" % "rest-assured" % "2.9.0" % "test" exclude("org.codehaus.groovy", "groovy"),
"org.codehaus.groovy" % "groovy-all" % "2.4.8" % "test",
"org.apache.commons" % "commons-lang3" % "3.5",
"commons-validator" % "commons-validator" % "1.5.1",
"org.hamcrest" % "hamcrest-all" % "1.3" % "test",
"com.lowagie" % "itext" % "4.2.1",
"ar.com.fdvs" % "DynamicJasper-core-fonts" % "1.0",
"org.olap4j" % "olap4j" % "1.2.0",
"javax.mail" % "mail" % "1.4.7",
"org.apache.james" % "james-server-cli" % "3.0-beta4",
"org.apache.james" % "james-server-data-api" % "3.0-beta4",
"org.apache.cxf" % "cxf-rt-frontend-jaxws" % "3.1.9",
"org.apache.cxf" % "cxf-rt-transports-http" % "3.1.9",
"org.apache.cxf" % "cxf-rt-transports-http-jetty" % "3.1.9",
"org.apache.cxf" % "cxf-rt-ws-security" % "3.1.9",
"net.lingala.zip4j" % "zip4j" % "1.3.2",
"com.jolbox" % "bonecp" % "0.8.0.RELEASE",
"org.json" % "json" % "20160810",
"commons-lang" % "commons-lang" % "2.6",
"net.tanesha.recaptcha4j" % "recaptcha4j" % "0.0.7",
"log4j" % "log4j" % "1.2.17",
"org.scribe" % "scribe" % "1.3.7",
"org.javassist" % "javassist" % "3.18.0-GA",
"net.sourceforge.dynamicreports" % "dynamicreports-core" % "5.0.0",
"net.sourceforge.dynamicreports" % "dynamicreports-adhoc" % "5.0.0",
"org.nhind" % "xd-common" % "1.1-SNAPSHOT",

"org.springframework" % "spring-core" % "4.3.6.RELEASE",
"org.springframework" % "spring-context" % "4.3.6.RELEASE",

"org.springframework" % "spring-test" % "4.3.6.RELEASE" % "test",
"org.easytesting" % "fest-assert" % "1.4",
"com.actimust"% "play-spring-loader" % "1.0.0"
)


lazy val ccdUniverse = (project in file("dependency-projects/ccd-universe"))
lazy val emailNotification = (project in file("dependency-projects/EmailNotification"))
lazy val SoapClient = (project in file("dependency-projects/soap.client"))
lazy val mailClient = (project in file("dependency-projects/mailclient"))
lazy val XDM = (project in file("dependency-projects/xdm")).dependsOn(ccdUniverse)
lazy val PortalExceptions = (project in file("dependency-projects/exceptions"))
//lazy val playPac4jJava = (project in file("dependency-projects/play-pac4j_java"))
lazy val readyClient = (project in file("dependency-projects/ready.client"))

fork in run := true

routesGenerator := InjectedRoutesGenerator




--------------------------------puglins.sbt-------------------------------------

// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.10")

// Web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6")

// Play enhancer - this automatically generates getters/setters for public fields
// and rewrites accessors of these fields to use the getters/setters. Remove this
// plugin if you prefer not to have this feature, or disable on a per project
// basis using disablePlugins(PlayEnhancer) in your build.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")

// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using
//enablePlugins(PlayEbean).
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2")

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2")



------build.properties---------
sbt.version=0.13.13



Thanks

Mariot Chauvin

unread,
Mar 2, 2017, 9:36:13 AM3/2/17
to play-fr...@googlegroups.com
Hi Malik,

Here is the approach I will recommend, having work on lot of play projects and few very large ones such as the guardian frontend.
Update (and deploy) from one major version at a time:
  • from 2.1.x to 2.1.5
  • from 2.1.5 to 2.2.6
  • from 2.2.6 to 2.3.10
  • from 2.2.6 to 2.3.10
  • from 2.3.10 to 2.4.10
  • from 2.4.10 to 2.5.12
At each of this 7 steps you will need to read carefully the migration guide and try to fix as much as the deprecation warnings you.

By deploying at each step, you will get more and more confident that the application will work as expected on the latest version, and catching/fixing regressions will be much easier.

On the long term, I would recommend you to:
  • update frequently your application when a new version is available(i.e as soon as possible):
    • the amount of work will be small
    • the changeset will be limited so catching and fixing regressions is easier
    • you will have to automate as much as possible your deployment pipeline 

  • switch from runtime DI to compile-time DI
    • you will catch errors at compile time rather at runtime
    • you will reduce accidental complexity of your apps  

Good luck,

Mariot

--
You received this message because you are subscribed to the Google Groups "Play Framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email to play-framework+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/play-framework/351f872e-e4a9-4c9a-9148-f9f721d634b8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



This e-mail and all attachments are confidential and may also be privileged. If you are not the named recipient, please notify the sender and delete the e-mail and all attachments immediately. Do not disclose the contents to another person. You may not use the information for any purpose, or store, or copy, it in any way.  Guardian News & Media Limited is not liable for any computer viruses or other material transmitted with or as part of this e-mail. You should employ virus checking software.
 
Guardian News & Media Limited is a member of Guardian Media Group plc. Registered Office: PO Box 68164, Kings Place, 90 York Way, London, N1P 2AP.  Registered in England Number 908396


Will Sargent

unread,
Mar 2, 2017, 2:14:39 PM3/2/17
to play-fr...@googlegroups.com
FYI, you can see the links to migration guides for each version on the releases page:


And you may be interested in the 2.3 to 2.5 blog post by LucidChart:


--
Will Sargent
Engineer, Lightbend, Inc.


Reply all
Reply to author
Forward
0 new messages