2017-09-05 118 views
0

我想升級我的應用程序從播放2.2.6玩2.6.3,我堅持這個問題。播放框架2.6:NoClassDefFoundError:播放/緩存/ DefaultCacheApi

我已閱讀@KdgDev's@NikolajPL's問題的答案,聽起來很相似,但至今沒有任何幫助。

我不確定這個問題起源於哪裏,但我認爲它可能與Redis DB連接有關,因爲它使用了不同的緩存方法,並且從播放2.5開始,應該禁用默認的ehcahce。

我的conf文件:

# 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" 

我正在我的SBT項目,並得到以下堆棧跟蹤:

--- (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 

回答

1

您正在引用Typesafe Redis模塊,該模塊適用於2.3,2.4或2.5。它與2.6不兼容,因爲Play 2.6中的緩存實現與2.5中的實現不是二進制兼容的。

你有3種選擇:

1)使用默認的EHCache 2)更新Redis的模塊可與2.6 3)庫克自己的實現兼容。