在Eclipse(App Engine)项目中包含JAR文件

我一直在寻找这个问题的解决方案今天和昨天的几个小时,所以我决定在这里解决它,虽然这似乎是一个愚蠢的问题。

情况:我在Eclipse Java EE中设置了Google AppEngine项目。 它存在多周,一切运行正常,我可以部署到App Engine并在没有probs的情况下在Eclipse中进行测试。

现在我需要为fe JSON支持和Google Visualization API添加JAR包。 我在一周前尝试过JSON,因为它失败了,我只是下载了源文件并将它们添加到我自己的源代码中。 但是现在使用可视化的东西,它是太多的源文件,所以我需要JAR工作。

我做了什么:

  • 下载了JAR文件。
  • 将它们放在PROJECT / lib文件夹中。
  • 选择它们并右键单击并单击“构建路径”>“添加到构建路径”。

发生了什么:一切顺利,我可以导入类并从中创建子类而没有错误。 所以很明显,Eclipse认识到了类的存在,而Eclipse已成功导入它们。

然后我尝试构建它(调试模式)并得到以下错误(我用JSON得到的那个):

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

我不知道它是否用斜线而不是带点来打印出类的事实是问题的一部分: com/google/visualization/datasource/DataSourceServlet 。 在第二部分,他确实使用点。

我找了很长时间的问题,听说过类路径文件。 我的.classpath文件如下所示:

              

只有war/WEB-INF/classes不存在..

Ow,另一件事:我专门找到了有关App Engine的文档,他们有时会提到war/WEB-INF/lib文件夹,所以我也尝试将它放在那里。 当然,从构建路径中删除并在移动后读取。 (这是我粘贴的那个版本的类路径文件)。

有谁知道如何解决这个问题? 简介:Eclipse识别导入的JAR,但由于某种原因构建失败…

编辑:解决方案我发现以下内容:

  • JAR应该在WEB-INF / lib中
  • JAR不应该位于lib中的文件夹中,所有文件都位于根WEB-INF / lib文件夹中。 我有一个单独的文件夹,但没有用。
  • 我做了Source> Clean Up和Source> Manage imports,它确实有效。

你走在正确的轨道上。 由于部署到appengine的应用程序打包为战争(Web应用程序存档),因此库jar需要位于WEB-INF / lib中。 你应该确保你的jar子在那里,然后将这些jar子添加到你的eclipse构建路径中。 尝试对项目执行“干净”操作并重新构建它以确保库位于包中。

这个解决方案:

  • 将源(.jar文件)复制到war / WEB-INF / lib文件夹中

您仍然需要将jar文件添加到java构建路径,以避免在将文件添加到war / WEB-INF / lib文件夹后出现编译错误!

复制将.jar文件粘贴到war / WEB-INF / lib,然后转到Properties(Eclipse中的项目) – > Java Build Path – > Add JARs – >从当前项目中选择相关的.jars。 你应该全力以赴!

这可能是“有点”太迟了,但在日食中你不必手动复制。 右键单击项目 – >构建路径 – >配置构建路径… – >选择部署程序集(左)。 在这里添加你的jar子,它们将在部署时包括在内。