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



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

情况:我在Eclipse Java EE中有一个Google AppEngine项目设置。它已经存在了好几个星期,一切都运行良好,我可以部署到App Engine并在Eclipse中测试而没有问题。

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

我做了什么:

  • 下载JAR文件。
  • 将它们放到PROJECT/lib文件夹中。
  • 选中它们,右键单击并单击"Build Path> Add to Build Path"。

发生了什么:一切正常,我可以导入类并从它们创建子类,而不会出现错误。因此,很明显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.<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

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

我找了一个问题很长一段时间,听到一些关于classpath文件的事情。我的.classpath文件看起来像这样:

<?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>

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

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

有人知道如何解决这个问题吗?摘要:Eclipse可以识别导入的jar,但由于某些原因构建失败…

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

  • jar应该在WEB-INF/lib
  • jar不应该在lib目录下的文件夹中,它们都在根WEB-INF/lib目录下。我把我的放在一个单独的文件夹里,但那不起作用。
  • 我做了源>清理和源>管理进口,它工作。

你做对了。由于应用程序在部署到appengine时被打包为war (web应用程序存档),因此库jar需要位于web - inf/lib中。您应该确保jar在那里,然后将这些jar添加到eclipse构建路径中。尝试对项目进行"清理"操作并重新构建它,以确保库在包中。

这个解决方案

  • 将source (.jar文件)拷贝到war/WEB-INF/lib文件夹

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

复制粘贴.jar文件到war/WEB-INF/lib,然后进入Properties(Eclipse中的项目)-> Java Build Path -> Add JARs ->从当前项目中选择相关的.jar文件。你应该都准备好了!

可能"有点"晚了,但是在eclipse中您不需要手动复制。右键单击project -> Build Path -> Configure Build Path…->选择部署程序集(左侧)。在这里添加您的jar,它们将在部署时包含。

最新更新