Slim3 で「Could not initialize class org.slim3.datastore.Datastore」が発生する

このサンプルチュートリアルを作成中に、index.jsp にアクセスをすると下記のエラーが発生する。

HTTP ERROR 500

Problem accessing /bbs/. Reason:

    Could not initialize class org.slim3.datastore.Datastore
Caused by:

java.lang.NoClassDefFoundError: Could not initialize class org.slim3.datastore.Datastore
	at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:68)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.slim3.controller.HotReloadingFilter.doHotReloading(HotReloadingFilter.java:223)
	at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:187)
	at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Powered by Jetty://

必要な jar ファイルがプロジェクトにコピーされていないことが原因

ググって調べてみたところ、同じようなエラーが発生している人がいた。

war/WEB-INF/lib 以下を調べてみれば、google app engineに必要と思われるjarが空っぽである

http://otsubo.info/blog/2011/03/slim3-on-macjavalangnoclassdeffounderror.html

確かに作成中のプロジェクトにある「war/WEB-INF/lib」下にある jar ファイルが下記のものだけしかない。
ファイル名に記述されているバージョン番号は適宜読み替える。

そして、不足している jar ファイルは下記のファイル。

  • appengine-api-1.0-sdk-1.4.2.jar
  • appengine-api-labs-1.4.2.jar
  • appengine-jsr107cache-1.4.2.jar
  • datanucleus-appengine-1.0.8.final.jar
  • datanucleus-core-1.1.5.jar
  • datanucleus-jpa-1.1.5.jar
  • geronimo-jpa_3.0_spec-1.1.1.jar
  • geronimo-jta_1.1_spec-1.1.1.jar
  • jdo2-api-2.3-eb.jar
  • jsr107cache-1.1.jar

解決方法

新規に slim3 のプロジェクトを作成して、不足しているな jar ファイルを既存のプロジェクトの「war/WEB-INF/lib」にコピーする。
解決後の「war/WEB-INF/lib」下にある jar ファイルは下記のようになる。

  • appengine-api-1.0-sdk-1.4.2.jar
  • appengine-api-labs-1.4.2.jar
  • appengine-jsr107cache-1.4.2.jar
  • datanucleus-appengine-1.0.8.final.jar
  • datanucleus-core-1.1.5.jar
  • datanucleus-jpa-1.1.5.jar
  • geronimo-jpa_3.0_spec-1.1.1.jar
  • geronimo-jta_1.1_spec-1.1.1.jar
  • gwt-servlet.jar
  • jdo2-api-2.3-eb.jar
  • jsr107cache-1.1.jar
  • junit-4.7.jar
  • ktrwjr.jar
  • slim3-1.0.9.jar