Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Including JAR files in Eclipse (App Engine) project

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.

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.

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.

What I did:

  • downloaded the JAR files.
  • putted them in a PROJECT/lib folder.
  • selected them and right-clicked and clicked Build Path > Add to build path.

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.

Then I tried to build it (Debug Mode) and got following error (the one I got with JSON too):

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.<init>(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

I don't know if the fact that it prints out the class with slashed instead of with dots is part of the issue: com/google/visualization/datasource/DataSourceServlet. In the second part he does use dots.

I looked for an issue a very long time, and heard things about classpath file. My .classpath file looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" output="test-classes" path="test"/>
    <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/App Engine (1)"/>
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-lang-2.4.jar"/>
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-logging-1.1.1.jar"/>
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/opencsv-1.8.jar"/>
    <classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/visualization-datasource-1.1.1.jar"/>
    <classpathentry kind="output" path="war/WEB-INF/classes"/>
</classpath>

Only the war/WEB-INF/classes does not exist..

Ow, another thing: I found documents about App Engine specifically and they sometimes mentioned the war/WEB-INF/lib 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).

Does anyone have an idea how this can be solved? Summary: Eclipse recognizes the imported JARs, but build fails for some reason...

EDIT: solution I found the following:

  • JARs should be in WEB-INF/lib
  • 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.
  • I did Source > Clean Up and Source > Manage imports and it worked.
like image 649
Steven Roose Avatar asked Nov 27 '11 12:11

Steven Roose


People also ask

Can we import JAR file in Eclipse?

Drag the jar file into the project folder in Eclipse. The jar file will now show up in the project. 2. Right click on the project after you have added the jar and select Properties.

Why can I not add external jars in Eclipse?

However, the 'add external jars' button is greyed out, implying that i am not allowed to use it. Can anyone help? If your project builds with Java 9+ make sure you've selected Classpath (as shown here). You should also be able to add the JAR with right-click on the project > Build Path > Add External Archives....


1 Answers

You are on the right track. Since the app when deployed to appengine is packaged as a war (web application archive), library jars need to be in WEB-INF/lib. You should ensure your jars are there and then add those jars to your eclipse build path. Try doing a "clean" operation on the project and re-building it to ensure the libraries is in the package.

like image 167
Chris Avatar answered Sep 19 '22 12:09

Chris