I am trying to use JPA on Google AppEngine. I am aware of the JPA
limitations here but I need the scaling and other benefits of the GAE.
Environment
Play! 1.1.1
GAE-1.4 module.
Google Java Appengine SDK 1.4.2
I have updated the play.jar by removing the line
400:play.db.jpa.JPAPlugin
from play.plugins (So Play! does not try to process the JPA annotated
sources)
I have created a file in app/models/User.java
...
package models;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import
javax.persistence.Id;
import javax.persistence.Query;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String userId;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...
I use play war to generate the war file
And then I use the Datanucleus ant tool to enhance the User.java file
for use on GAE
When I then deploy the file using the GAE SDK I get the following
errors:
WARNING: failed
com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@13e15f7{/,/
home/rmauge/playapps/peerwear.war}: java.lang.NoClassDefFoundError:
javax/jdo/spi/Detachable
Mar 23, 2011 1:16:49 PM com.google.apphosting.utils.jetty.JettyLogger
warn
WARNING: failed JettyContainerService$ApiProxyHandler@135b1f3:
java.lang.NoClassDefFoundError: javax/jdo/spi/Detachable
Mar 23, 2011 1:16:49 PM com.google.apphosting.utils.jetty.JettyLogger
warn
WARNING: Error starting handlers
java.lang.NoClassDefFoundError: javax/jdo/spi/Detachable
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at
play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:
103)
at
play.classloading.ApplicationClassloader.getAllClasses(ApplicationClassloader.java:
392)
at play.Play.preCompile(Play.java:482)
at play.Play.init(Play.java:273)
at play.server.ServletWrapper.contextInitialized(ServletWrapper.java:
55)
at
org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:
548)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at
org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:
1250)
at
org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:
517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:
467)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:
130)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:
130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at
com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:
186)
at
com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:
149)
at
com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:
219)
at com.google.appengine.tools.development.DevAppServerMain
$StartAction.apply(DevAppServerMain.java:164)
at com.google.appengine.tools.util.Parser
$ParseResult.applyArgs(Parser.java:48)
at
com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:
113)
at
com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:
89)
Caused by: java.lang.ClassNotFoundException: javax.jdo.spi.Detachable
at java.lang.ClassLoader.findClass(ClassLoader.java:359)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at
play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:
84)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 26 more
Is there a way to exclude certain files from Play! precompilation or
another solution to this?
Thanks
Ray.