title: Including JAR files in Eclipse (App Engine) project
body: <p>I have been searching for a solution for this issue for multiple hours today and many hours yesterday so I decided to address it here, although it seems a stupid issue.</p>
  
  <p>Situation: I have a Google AppEngine project setup in Eclipse Java EE. It's there for multiple weeks everything runs fine, I can deploy to App Engine and test in Eclipse without probs.</p>
  
  <p>Now I need to add JAR packages for f.e. JSON support and Google Visualization API. 
  I tried JSON a week ago and because it failed, I just downloaded the source files and added them to my own source.
  But now with the Visualizations thing, it are too much source files so I need the JARs working.</p>
  
  <p>What I did:</p>
  
  <ul>
  <li>downloaded the JAR files.</li>
  <li>putted them in a PROJECT/lib folder.</li>
  <li>selected them and right-clicked and clicked Build Path > Add to build path.</li>
  </ul>
  
  <p>What happened: All went fine, I could import the classes and create subclasses from them without having errors. So it's clear that Eclipse recognized the classes' existence and Eclipse had them imported successfully.</p>
  
  <p>Then I tried to build it (Debug Mode) and got following error (the one I got with JSON too):</p>
  
  <pre><code>Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
  WARNING: failed chartDataServlet: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
  Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
  WARNING: failed com.google.appengine.tools.development.DevAppEngineWebAppContext@727db937{/,/Volumes/Data/eclipse_workspace/kulStats/war}: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
  Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
  WARNING: failed JettyContainerService$ApiProxyHandler@409bad4f: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
  Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
  WARNING: Error starting handlers
  java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
  at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
  at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
  at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
  at org.mortbay.util.Loader.loadClass(Loader.java:91)
  at org.mortbay.util.Loader.loadClass(Loader.java:71)
  at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
  at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
  at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
  at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
  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:191)
  at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239)
  at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146)
  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.&lt;init&gt;(DevAppServerMain.java:113)
  at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
  
  Caused by: java.lang.ClassNotFoundException: com.google.visualization.datasource.DataSourceServlet
      at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
      at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
      ... 35 more
  </code></pre>
  
  <p>I don't know if the fact that it prints out the class with slashed instead of with dots is part of the issue: <code>com/google/visualization/datasource/DataSourceServlet</code>.
  In the second part he does use dots.</p>
  
  <p>I looked for an issue a very long time, and heard things about classpath file. My .classpath file looks like this:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;classpath&gt;
      &lt;classpathentry kind="src" path="src"/&gt;
      &lt;classpathentry kind="src" output="test-classes" path="test"/&gt;
      &lt;classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/&gt;
      &lt;classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/&gt;
      &lt;classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/App Engine (1)"/&gt;
      &lt;classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-lang-2.4.jar"/&gt;
      &lt;classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-logging-1.1.1.jar"/&gt;
      &lt;classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/opencsv-1.8.jar"/&gt;
      &lt;classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/visualization-datasource-1.1.1.jar"/&gt;
      &lt;classpathentry kind="output" path="war/WEB-INF/classes"/&gt;
  &lt;/classpath&gt;
  </code></pre>
  
  <p>Only the <code>war/WEB-INF/classes</code> does not exist..</p>
  
  <p>Ow, another thing: I found documents about App Engine specifically and they sometimes mentioned the <code>war/WEB-INF/lib</code> folder, so I tried putting it there as well. Of course after deleting from build path and reading after the move. (It's that version of the classpath file I've pasted).</p>
  
  <p>Does anyone have an idea how this can be solved?
  Summary: Eclipse recognizes the imported JARs, but build fails for some reason...</p>
  
  <p><strong>EDIT: solution</strong>
  I found the following:</p>
  
  <ul>
  <li>JARs should be in WEB-INF/lib</li>
  <li>JARs should not be in folders within lib, all in the root WEB-INF/lib folder. I had mine in a separate folder and that didn't work.</li>
  <li>I did Source > Clean Up and Source > Manage imports and it worked.</li>
  </ul>