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ファイルまでコピーしてしまったのが原因。

不要なものが残っているとトラブルの原因という、基本的な話でした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です