开发者

ClassNotFoundException on GAE with GWT RPC

I'm using PlayN to develop a game. It contains a type,GameEvent, defined in my-game-core project. My GWT and GAE code lives in my-game-html, which has my-game-core as a Maven dependency.

Here is the service impl:

package com.mygame.html.server;

import com.mygame.core.event.GameEvent;
import com.mygame.html.client.ServerEventHandlerService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class ServerEventHandlerServiceImpl extends RemoteServiceServlet
        implements ServerEventHandlerService {

    @Override
    public String handleEvent(final GameEvent event) {
        return "holy porkchops batman!";
    }

}

This compiles just fine. However, when I try to call the service at runtime on the local dev server, I开发者_高级运维 get the following error:

SEVERE: javax.servlet.ServletContext log: Exception while dispatching incoming RPC call
java.lang.NoClassDefFoundError: com/mygame/core/event/GameEvent
...
Caused by: java.lang.ClassNotFoundException: com.mygame.core.event.GameEvent
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 39 more

If I take out GameEvent and replace it with a type like String, everything works fine.

What could I be doing wrong here? GameEvent has a default constructor.

Update: Here is pom.xml for the *-html project:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>mygame-game</artifactId>
    <groupId>com.mygame</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
  </parent>
  <artifactId>mygame-game-html</artifactId>
  <packaging>war</packaging>
  <name>my game html build</name>

  <properties>
    <gwt.module>com.mygame.MygameGame</gwt.module>
    <gwt.name>mygame</gwt.name>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.mygame</groupId>
      <artifactId>mygame-game-core</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.playn</groupId>
        <artifactId>playn-html</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

  <build>
    <sourceDirectory>src</sourceDirectory>
    <outputDirectory>war/WEB-INF/classes</outputDirectory>

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1.1</version>
        <configuration>
          <warSourceDirectory>war</warSourceDirectory>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>gwt-maven-plugin</artifactId>
        <!-- we need class metadata, override PlayN's disabling of such -->
        <configuration>
          <disableClassMetadata>false</disableClassMetadata>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.8</version>
        <configuration>
          <downloadSources>true</downloadSources>
          <downloadJavadocs>false</downloadJavadocs>
          <wtpversion>2.0</wtpversion>
          <additionalBuildcommands>
            <buildCommand>
              <name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
            </buildCommand>
          </additionalBuildcommands>
          <additionalProjectnatures>
            <projectnature>com.google.gwt.eclipse.core.gwtNature</projectnature>
          </additionalProjectnatures>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Update 2: In war/WEB-INF/lib, I have:

  • appengine-api-1.0-sdk-1.5.4.jar
  • appengine-api-1.0-sdk-1.5.5.jar
  • appengine-api-labs-1.5.4.jar
  • appengine-api-labs-1.5.5.jar
  • appengine-jsr107cache-1.5.4.jar
  • appengine-jsr107cache-1.5.5.jar
  • datanucleus-appengine-1.0.9.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


you are missing your dependency my-game-core in the runtime classpath of the jetty that gwt launches.

Did you import your project with mvn eclipse:eclipse into eclipse? Maybe your runtime classpath still points to your local maven repo, but you already changed your eclipse project (my-game-core). Take a look at your eclipse classpath and make sure it only has the other project on it and not the jar from the repo.

Also check on the classpath tab in your run configuration.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜