I am trying out protocol buffers for the first time, and have written
a simple client and servlet to send and receive the PB. It will run on
App Engine. However every time I try it hits a NoClassDefFoundError
for GeneratedMessages.
The error is:
ov 27, 2009 12:54:38 PM com.google.apphosting.utils.jetty.JettyLogger
warn
WARNING: Error for /testfileupload
java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessage
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:700)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:
124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
at
com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass
(IsolatedAppClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:254)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:399)
at my.testfiletransfer.TestFileUploadServlet.doGet
(TestFileUploadServlet.java:28)
at my.testfiletransfer.TestFileUploadServlet.doPost
(TestFileUploadServlet.java:20)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
(ServletHandler.java:1093)
at
com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter
(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
(ServletHandler.java:1084)
at com.google.appengine.tools.development.StaticFileFilter.doFilter
(StaticFileFilter.java:121)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle
(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle
(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle
(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle
(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle
(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.handler.HandlerWrapper.handle
(HandlerWrapper.java:139)
at com.google.appengine.tools.development.JettyContainerService
$ApiProxyHandler.handle(JettyContainerService.java:342)
at org.mortbay.jetty.handler.HandlerWrapper.handle
(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:313)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
506)
at org.mortbay.jetty.HttpConnection$RequestHandler.content
(HttpConnection.java:844)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
at org.mortbay.io.nio.SelectChannelEndPoint.run
(SelectChannelEndPoint.java:396)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run
(BoundedThreadPool.java:442)
Caused by: java.lang.ClassNotFoundException:
com.google.protobuf.GeneratedMessage
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
at
com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass
(IsolatedAppClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:254)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:399)
... 39 more
------------------------------------------------------------------------------------------------------
The client is:
package my.testfiletransfer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import my.tft.protos.RandomMessageProtos.Note;
import my.tft.protos.RandomMessageProtos.RandomMessage;
public class TestFileUploadClient {
public static void main(String[] args) {
BufferedReader in = null;
try {
System.out.println("starting client");
File source = new File("/Users/darkmaster108/Documents/blarg.txt");
URL url = new URL("
http://localhost:8080/testfileupload");
URLConnection urlc = url.openConnection();
urlc.setDoOutput(true);
urlc.connect();
RandomMessage.Builder randomMessage = RandomMessage.newBuilder();
Note.Builder note = Note.newBuilder();
note.setName(source.getName());
StringBuffer sb = new StringBuffer();
in = new BufferedReader(new FileReader(source));
String line;
while ((line = in.readLine()) != null)
sb.append(line);
note.setMessage(sb.toString());
randomMessage.addNote(note);
randomMessage.build().writeTo(urlc.getOutputStream());
urlc.getOutputStream().close();
BufferedReader rd = new BufferedReader(new InputStreamReader(urlc
.getInputStream()));
System.out.println("Respose is:");
while ((line = rd.readLine()) != null) {
System.out.println(line);
}
rd.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} // finally
}
}
------------------------------------------------------------------------------------------------------
The server is:
package my.testfiletransfer;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import my.tft.protos.RandomMessageProtos.RandomMessage;
@SuppressWarnings("serial")
public class TestFileUploadServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
doGet(req, resp);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
try {
InputStream is = req.getInputStream();
RandomMessage randomMessage = RandomMessage.parseFrom(is);
is.close();
System.err.println("Name: " + randomMessage.getNote(1).getName());
System.err.println("Message: " + randomMessage.getNote(1).getMessage
());
PrintWriter out = resp.getWriter();
out.println("ok");
out.close();
} catch(Exception e) {
System.err.println(e.getMessage());
}
}
}
Any help would be much appreciated, I'm sure I'm making a silly little
mistake.