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ファイルまでコピーしてしまったのが原因。
不要なものが残っているとトラブルの原因という、基本的な話でした。