Play Framework 2.6:NoClassDefFoundError:play / cache / DefaultCacheApi

时间:2017-09-05 15:02:24

标签: java playframework ehcache playframework-2.6 cacheapi

我正在尝试将我的应用程序从2.2.6升级到2.6.3,我一直坚持这个问题。

我已经阅读了@KdgDev's@NikolajPL's个问题的答案,听起来很相似,但到目前为止没有任何帮助。

我不确定这个问题的来源,但我认为它可能与Redis数据库连接有关,因为它使用不同的缓存方法,并且从play 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:def@localhost: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:def@localhost: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运行我的项目并获得以下stacktrace:

--- (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 个答案:

答案 0 :(得分:1)

您正在引用Typesafe Redis模块,该模块适用于2.3,2.4或2.5。它与2.6不兼容,因为Play 2.6中的缓存实现与2.5中的实现不是二进制兼容的。

您有3个选项:

1)使用默认的EHCache 2)更新Redis模块以与2.6兼容 3)制定自己的实施方案。