2017-09-05 1 views
0

J'essaie de mettre à jour mon application depuis le jeu 2.2.6 pour jouer 2.6.3, et je suis bloqué avec ce problème.Jouer Framework 2.6: NoClassDefFoundError: play/cache/DefaultCacheApi

J'ai lu les réponses aux questions @KdgDev's et @NikolajPL's, qui semblent similaires, mais jusqu'à présent, rien n'a aidé. Je ne suis pas sûr d'où ce problème provient, mais je pense qu'il pourrait être lié à la connexion Redis DB, car il utilise une méthode de mise en cache différente, et à partir de jouer 2.5 ehcahce par défaut devrait être désactivé.

Mon fichier de configuration:

# Mongo configuration 
# ~~~~~~~~~~~~~~~~~ 
mongodb.name=mongoAbc 
mongodb.host=localhost 
mongodb.port=27017 

application.global=api.abc 


# Spring configuration 
# ~~~~~ 
# Define what spring context should be used. 
spring.context="components.xml" 


# Router 
# ~~~~~ 
# Define the Router object to use for this application. 
# This router will be looked up first when the application is starting up, 
# so make sure this is the entry point. 
# Furthermore, it's assumed your route file is named properly. 
# So for an application router like `conf/my.application.Router`, 
# you may need to define a router file `my.application.controllers`. 
# Default to Routes in the root package (and `conf/controllers`) 
# application.router=my.application.Routes 


# Test configuration 
# ~~~~~ 
# To create test/1.sql uncomment following lines: 
#ebean.test="model.*" 
#db.test.driver=org.postgresql.Driver 
#db.test.url="postgres://abc:[email protected]:5432/abc" 
#applyEvolutions.test=true 


# Database configuration 
# ~~~~~ 
# You can declare as many datasources as you want. 
# By convention, the default datasource is named `default` 
# 
# db.default.driver=org.h2.Driver 
# db.default.url="jdbc:h2:mem:play" 
# db.default.user=sa 
# db.default.password="" 

db.default.driver=org.postgresql.Driver 
db.default.url="postgres://abc:[email protected]:5432/abc" 


# DB Pooling 
# -------------- 
# In order to reduce lock contention and thus improve performance, 
# each incoming connection request picks off a connection from a 
# pool that has thread-affinity. 
# The higher this number, the better your performance will be for the 
# case when you have plenty of short-lived threads. 
# Beyond a certain threshold, maintenance of these pools will start 
# to have a negative effect on performance (and only for the case 
# when connections on a partition start running out). 
db.default.partitionCount=7 

# The number of connections to create per partition. Setting this to 
# 5 with 3 partitions means you will have 15 unique connections to the 
# database. Note that BoneCP will not create all these connections in 
# one go but rather start off with minConnectionsPerPartition and 
# gradually increase connections as required. 
db.default.maxConnectionsPerPartition=30 

# The number of initial connections, per partition. 
db.default.minConnectionsPerPartition=5 

# When the available connections are about to run out, BoneCP will 
# dynamically create new ones in batches. This property controls 
# how many new connections to create in one go (up to a maximum of 
# maxConnectionsPerPartition). Note: This is a per-partition setting. 
db.default.acquireIncrement=1 

# After attempting to acquire a connection and failing, try to 
# connect this number of times before giving up. 
db.default.acquireRetryAttempts=10 

# How long to wait before attempting to obtain a 
# connection again after a failure. 
db.default.acquireRetryDelay=5 seconds 

# The maximum time to wait before a call 
# to getConnection is timed out. 
db.default.connectionTimeout=1 second 

# Idle max age 
db.default.idleMaxAge=10 seconds 

# This sets the time for a connection to remain idle before sending a test query to the DB. 
# This is useful to prevent a DB from timing out connections on its end. 
db.default.idleConnectionTestPeriod=5 minutes 

# An initial SQL statement that is run only when 
# a connection is first created. 
db.default.initSQL="SELECT 1" 

# If enabled, log SQL statements being executed. 
db.default.logStatements=false 

# The maximum connection age. 
db.default.maxConnectionAge=20 seconds 

# You can expose this datasource via JNDI if needed (Useful for JPA) 
# db.default.jndiName=DefaultDS 

# Evolutions 
# ~~~~~ 
# You can disable evolutions if needed 
# evolutionplugin=disabled 

# Ebean configuration 
# ~~~~~ 
# You can declare as many Ebean servers as you want. 
# By convention, the default server is named `default` 
# 
ebean.default="model.*" 
applyEvolutions.default=true 
applyDownEvolutions.default=true 

# MailGun configuration 
# ~~~~~~~~~~~~~~~~~ 
mailgun.api.key=${?MAILGUN_API_KEY} 
mailgun.domain=${?MAILGUN_DOMAIN} 

# Uncomment to prevent sending real emails 
# mail.disabled=true 

# Logger 
# ~~~~~ 
# You can also configure logback (http://logback.qos.ch/), 
# by providing an application-log.xml file in the conf directory. 

#logger=OFF 
#log.application=OFF 
#log.play=OFF 

# Redis 
# ~~~~~ 
ehcacheplugin=disabled 
redis.uri=${?REDISCLOUD_URL} 

# The default cache module (EhCache) will be used for all non-named cache UNLESS this module (RedisModule) 
# is the only cache module that was loaded. If this module is the only cache module being loaded, 
# it will work as expected on named and non-named cache. To disable the default cache module so that this Redis Module 
# can be the default cache you must put this in your configuration 
# See https://github.com/playframework/play-plugins/tree/master/redis for reference 
play.modules.disabled += "play.api.cache.EhCacheModule" 

# Redis module supports play 2.5 NamedCaches through key namespacing on a single Sedis pool. 
# To add additional namepsaces besides the default (play), the configuration would 
# look like play.cache.redis.bindCaches = ["db-cache", "user-cache", "session-cache"] 
# See https://github.com/playframework/play-plugins/tree/master/redis for reference 
play.cache.redis.bindCaches = ["db-cache", "user-cache", "session-cache"] 

# Amazon 
# ~~~~~ 
youtube.api.key=${?ABC_YOUTUBE_API_KEY} 

# Akka 
# Threadpool 
# ~~~~~~~~~~ 
play { 
    akka { 
     akka.loggers = ["akka.event.slf4j.Slf4jLogger"] 
     loglevel = DEBUG 
     jvm-exit-on-fatal-error = off 
     log-config-on-start = off 
     actor { 
      default-dispatcher = { 
       fork-join-executor { 
        parallelism-min = 50 
        parallelism-max = 120 
       } 
      } 
      download-context = { 
       fork-join-executor { 
        parallelism-min = 50 
        parallelism-max = 50 
       } 
      } 
      conversion-context { 
       fork-join-executor { 
        parallelism-min = 1 
        parallelism-factor = 1.0 
        parallelism-max = 10 
       } 
      } 
     } 
    } 
} 
akka.log-dead-letters = off 
akka.log-dead-letters-during-shutdown = off 

# Modules 
# ~~~~~~~ 
play.modules.enabled += "module.MongoDBModule" 
play.modules.enabled += "module.S3Module" 

play.cache.defaultCache=default 

play.cache.dispatcher = "contexts.blockingCacheDispatcher" 

contexts { 
    blockingCacheDispatcher { 
     fork-join-executor { 
      parallelism-factor = 3.0 
     } 
    } 
} 

build.sbt

name := "abc-api" 

version := "0.27.7" 

lazy val abc_api = (project in file(".")).enablePlugins(PlayJava, PlayEbean) 

scalaVersion := "2.11.1" 

lazy val akkaVersion = "2.5.3" 

libraryDependencies ++= Seq(
    javaJdbc, 
    guice, 
    ehcache, 
    cacheApi, 
    evolutions, 
    "org.avaje.ebeanorm" % "avaje-ebeanorm-api" % "3.1.1", 
    "com.jolbox" % "bonecp" % "0.8.0.RELEASE", 
    // https://mvnrepository.com/artifact/io.rest-assured/rest-assured 
    "io.rest-assured" % "rest-assured" % "3.0.3" % "test", 
    // https://mvnrepository.com/artifact/postgresql/postgresql 
    "postgresql" % "postgresql" % "9.1-901-1.jdbc4", 
    // https://mvnrepository.com/artifact/org.springframework/spring-context 
    "org.springframework" % "spring-context" % "4.3.10.RELEASE", 
    // https://mvnrepository.com/artifact/org.springframework/spring-test 
    "org.springframework" % "spring-test" % "4.3.10.RELEASE" % "test", 
    // https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk 
    "com.amazonaws" % "aws-java-sdk" % "1.11.188", 
    "org.imgscalr" % "imgscalr-lib" % "4.2", 
    // https://mvnrepository.com/artifact/org.apache.tika/tika-core 
    "org.apache.tika" % "tika-core" % "1.16", 
    // https://mvnrepository.com/artifact/org.apache.tika/tika-parsers 
    "org.apache.tika" % "tika-parsers" % "1.16", 
    // https://mvnrepository.com/artifact/commons-io/commons-io 
    "commons-io" % "commons-io" % "2.5", 
    // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 
    "org.apache.commons" % "commons-lang3" % "3.6", 
    // https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 
    "org.apache.commons" % "commons-collections4" % "4.1", 
    // https://mvnrepository.com/artifact/commons-validator/commons-validator 
    "commons-validator" % "commons-validator" % "1.6", 
    // https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient 
    "org.apache.httpcomponents" % "httpclient" % "4.5.3", 
    // Deprecated - ? "commons-httpclient" % "commons-httpclient" % "3.1" exclude("org.apache.commons", "httpclient"), 
    // https://mvnrepository.com/artifact/org.mockito/mockito-core 
    "org.mockito" % "mockito-core" % "2.9.0" % "test", 
    // https://mvnrepository.com/artifact/org.mockito/mockito-all 
    "org.mockito" % "mockito-all" % "2.0.2-beta" % "test", 
    // https://mvnrepository.com/artifact/org.mindrot/jbcrypt 
    "org.mindrot" % "jbcrypt" % "0.4", 
    // https://mvnrepository.com/artifact/org.jcodec/jcodec 
    "org.jcodec" % "jcodec" % "0.2.1", 
    // https://mvnrepository.com/artifact/com.mashape.unirest/unirest-java 
    "com.mashape.unirest" % "unirest-java" % "1.4.9", 
    // https://mvnrepository.com/artifact/com.github.spullara.mustache.java/compiler 
    "com.github.spullara.mustache.java" % "compiler" % "0.9.5", 
    // https://mvnrepository.com/artifact/xerces/xercesImpl 
    "xerces" % "xercesImpl" % "2.11.0", 
    // https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver 
    "org.mongodb" % "mongo-java-driver" % "3.6.0-beta1", 
    // https://mvnrepository.com/artifact/com.github.tomakehurst/wiremock 
    "com.github.tomakehurst" % "wiremock" % "2.8.0" % "test" pomOnly(), 
    // https://mvnrepository.com/artifact/com.sun.mail/javax.mail 
    "com.sun.mail" % "javax.mail" % "1.6.0", 
    // https://mvnrepository.com/artifact/io.dropwizard.metrics/metrics-core 
    "io.dropwizard.metrics" % "metrics-core" % "3.2.4", 
    // https://mvnrepository.com/artifact/io.dropwizard.metrics/metrics-healthchecks 
    "io.dropwizard.metrics" % "metrics-healthchecks" % "3.2.4", 
    // https://mvnrepository.com/artifact/io.dropwizard.metrics/metrics-jvm 
    "io.dropwizard.metrics" % "metrics-jvm" % "3.2.4", 
    // https://mvnrepository.com/artifact/org.jsoup/jsoup 
    "org.jsoup" % "jsoup" % "1.10.3", 
    // https://mvnrepository.com/artifact/com.helger/ph-css 
    "com.helger" % "ph-css" % "5.0.4", 
// https://mvnrepository.com/artifact/de.vandermeer/asciitable 
    "de.vandermeer" % "asciitable" % "0.3.2", 
    "com.typesafe.akka" %% "akka-actor" % akkaVersion, 
    "com.typesafe.akka" %% "akka-testkit" % akkaVersion, 
    "com.typesafe.play" %% "play-iteratees" % "2.6.1", 
    // https://mvnrepository.com/artifact/com.typesafe.play.modules/play-modules-redis_2.11 
    "com.typesafe.play.modules" % "play-modules-redis_2.11" % "2.5.0", 
    "org.easytesting" % "fest-assert" % "1.4" % "test", 
    filters 
) 

javaOptions in Test ++= Seq(
    "-Dtest.timeout=10000000", 
    "-Dconfig.file=conf/application-test.conf", 
    "-XX:MaxPermSize=2048M", 
    "-XX:+UseConcMarkSweepGC", 
    "-XX:+CMSClassUnloadingEnabled" 
) 

javacOptions in (Compile, compile) ++= Seq(
    "-Xlint", 
    "-source", 
    "1.8", 
    "-target", 
    "1.8" 
) 

scalacOptions += "-Yresolve-term-conflict:package" 

plugins.sbt

// Comment to get more information during initialization 
logLevel := Level.Warn 

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

// 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") 

addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0") 

// In order for DataService to work with spring we need to include the dependency here (see: https://groups.google.com/forum/#!topic/play-framework/UIsRqnQ8x3g) 
// https://mvnrepository.com/artifact/org.springframework/spring-context 
libraryDependencies += "org.springframework" % "spring-context" % "4.3.10.RELEASE" 

// https://mvnrepository.com/artifact/org.javassist/javassist 
libraryDependencies += "org.javassist" % "javassist" % "3.21.0-GA" 

Je courais mon projet avec SBT et obtenir le stacktrace suivant:

--- (Running the application, auto-reloading is enabled) --- 

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 

(Server started, use Enter to stop and go back to the console...) 

[error] application - 

! @758h3g5n5 - Internal server error, for (GET) [/] -> 

play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: play/cache/DefaultCacheApi] 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1.reload(DevServerStart.scala:190) 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1.get(DevServerStart.scala:124) 
    at play.core.server.AkkaHttpServer.play$core$server$AkkaHttpServer$$modelConversion(AkkaHttpServer.scala:183) 
    at play.core.server.AkkaHttpServer.play$core$server$AkkaHttpServer$$handleRequest(AkkaHttpServer.scala:189) 
    at play.core.server.AkkaHttpServer$$anonfun$5.apply(AkkaHttpServer.scala:106) 
    at play.core.server.AkkaHttpServer$$anonfun$5.apply(AkkaHttpServer.scala:106) 
    at akka.stream.impl.fusing.MapAsync$$anon$23.onPush(Ops.scala:1172) 
    at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:499) 
    at akka.stream.impl.fusing.GraphInterpreter.processEvent(GraphInterpreter.scala:462) 
    at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:368) 
Caused by: java.lang.NoClassDefFoundError: play/cache/DefaultCacheApi 
    at com.typesafe.play.redis.RedisModule.bindings(RedisModule.scala:61) 
    at play.api.inject.guice.GuiceableModuleConversions$class.guice(GuiceInjectorBuilder.scala:339) 
    at play.api.inject.guice.GuiceableModule$.guice(GuiceInjectorBuilder.scala:273) 
    at play.api.inject.guice.GuiceableModuleConversions$$anon$3$$anonfun$guiced$2.apply(GuiceInjectorBuilder.scala:318) 
    at play.api.inject.guice.GuiceableModuleConversions$$anon$3$$anonfun$guiced$2.apply(GuiceInjectorBuilder.scala:318) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.immutable.List.foreach(List.scala:383) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:245) 
    at scala.collection.immutable.List.map(List.scala:286) 
Caused by: java.lang.ClassNotFoundException: play.cache.DefaultCacheApi 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at com.typesafe.play.redis.RedisModule.bindings(RedisModule.scala:61) 
    at play.api.inject.guice.GuiceableModuleConversions$class.guice(GuiceInjectorBuilder.scala:339) 
    at play.api.inject.guice.GuiceableModule$.guice(GuiceInjectorBuilder.scala:273) 
    at play.api.inject.guice.GuiceableModuleConversions$$anon$3$$anonfun$guiced$2.apply(GuiceInjectorBuilder.scala:318) 
    at play.api.inject.guice.GuiceableModuleConversions$$anon$3$$anonfun$guiced$2.apply(GuiceInjectorBuilder.scala:318) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply 

Répondre

1

Vous référencez le module Typesafe Redis, qui est pour 2.3, 2.4 ou 2.5. Ce n'est pas compatible avec 2.6, du fait que l'implémentation du cache dans Play 2.6 n'est pas compatible avec l'implémentation dans 2.5.

Vous avez 3 options:

1) Utilisez la valeur par défaut) 2 EHCache Mettre à jour le module Redis être compatible avec 2,6 3) Cuisinez votre propre implémentation.