Cache play already exists
バッチからPlay.startを実行するとエラー
こちらを参考に、play frameworkで作ったwebサイトのバックグラウンド用タスクを作成し実行した。それに関しては別途エントリーを書くとして、以下のようにPlay.startを実行すると、
Play.start(new DefaultApplication(new java.io.File("."), cl, None, Mode.Prod))
その時に以下の様なエラーが出た。
[warn] play - Error stopping plugin net.sf.ehcache.ObjectExistsException: Cache play already exists at net.sf.ehcache.CacheManager.addCache(CacheManager.java:1163) ~[ehcache-core-2.6.0.jar:na] at play.api.cache.EhCachePlugin.x$1$lzycompute(Cache.scala:122) ~[play_2.10-2.1.1.jar:2.1.1] at play.api.cache.EhCachePlugin.x$1(Cache.scala:120) ~[play_2.10-2.1.1.jar:2.1.1] at play.api.cache.EhCachePlugin.manager$lzycompute(Cache.scala:120) ~[play_2.10-2.1.1.jar:2.1.1] at play.api.cache.EhCachePlugin.manager(Cache.scala:120) ~[play_2.10-2.1.1.jar:2.1.1] at play.api.cache.EhCachePlugin.onStop(Cache.scala:142) ~[play_2.10-2.1.1.jar:2.1.1] net.sf.ehcache.ObjectExistsException: Cache play already exists at net.sf.ehcache.CacheManager.addCache(CacheManager.java:1163) at play.api.cache.EhCachePlugin.x$1$lzycompute(Cache.scala:122) at play.api.cache.EhCachePlugin.x$1(Cache.scala:120) at play.api.cache.EhCachePlugin.cache$lzycompute(Cache.scala:120) at play.api.cache.EhCachePlugin.cache(Cache.scala:120) at play.api.cache.EhCachePlugin.onStart(Cache.scala:138) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:63) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:63) at scala.collection.immutable.List.foreach(List.scala:318) at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:63) at play.api.Play$$anonfun$start$1.apply(Play.scala:63) at play.api.Play$$anonfun$start$1.apply(Play.scala:63) at play.utils.Threads$.withContextClassLoader(Threads.scala:18) at play.api.Play$.start(Play.scala:62) at com.example.libs.BatchApplication$class.initialize(BatchApplication.scala:12) at com.example.libs.BatchApplication$class.main(BatchApplication.scala:21) at com.example.tasks.SomeTask$.main(SomeTask.scala:7) at com.example.tasks.SomeTask.main(SomeTask.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:71) at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:139) at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:71) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:139) at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:28) at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:45) at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:35) at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:45) at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74) at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96) at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:105) at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
classpathに同じモジュールのjarが2つ以上?
検索してみると、こんなのがすぐ見つかる。要はclasspathにplayのモジュールが複数含まれているのが原因というもの。ただ、実際に自分の環境でクラスパスを確認したけど、同じモジュールのjarが2つ存在しているって訳ではなさそうだった。
*-sources.jarが要らない
もう少し調べていてSOのこちらのスレッドが見つかった。結論からいうと、クラスパスから以下の2つのjarファイルを取り除いたらOKだった。
- play_2.10-2.1.1-sources.jar
- play_2.10-2.1.1-test-sources.jar
ローカル環境から本場環境にデプロイする際に、不要なjarファイルまでコピーしてしまったのが原因。
不要なものが残っているとトラブルの原因という、基本的な話でした。