2011-11-27 66 views
17

我一直在寻找一个针对这个问题的解决方案,这个解决方案对于今天的多个小时和昨天的几个小时都是如此,所以我决定在这里解决它,虽然这似乎是一个愚蠢的问题。在Eclipse(App Engine)项目中包含JAR文件

情况:我在Eclipse Java EE中安装了Google AppEngine项目设置。它在那里多周运行良好,我可以部署到App Engine并在Eclipse中进行测试而无需probs。

现在我需要为f.e添加JAR包。 JSON支持和Google Visualization API。 我一个星期前试过JSON,因为它失败了,我只是下载源文件并将它们添加到我自己的源代码中。 但现在用Visualizations的东西,它是太多的源文件,所以我需要工作的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 c[email protected]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 [email protected]: 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文件夹中。我有我的一个单独的文件夹,并没有工作。
  • 我确实来源>清理和来源>管理进口,它的工作。

回答

21

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

+0

清洁手术?我怎么做?实际上,Eclipse相对比较新。 和建筑?当我点击调试或运行按钮时,项目被重新构建,不是? –

+1

我可以在这里更新解决方案的帖子吗? 我发现以下内容: - JAR确实应在WEB-INF/lib中 - JAR不应位于lib中的文件夹中,全部位于根WEB-INF/lib文件夹中。我有我的一个单独的文件夹,并没有工作。 - 我做过源代码>清理和源代码>管理导入,并在事后工作:) –

+0

有时eclipse无法复制JAR文件在构建路径中指定到WEB-INF/lib文件夹。在我的情况下,建立路径设置的命令和导出选项卡下的库条目得不到选中(我不知道为什么),所以我只检查了它们并解决了问题。 –

4

此解决方案:

  • 复制源(.jar文件)到战争/ WEB-INF/lib文件夹
2

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

1

复制粘贴.jar文件到war/WEB-INF/lib,然后进入属性(在Eclipse中的项目) - > Java Build Path - >添加JAR - >从相关的.jars中选择当前的项目。你应该全部设置!

0

对于这个可能太“有点”太迟,但在eclipse中你不必手动复制。 右键单击项目 - >构建路径 - >配置构建路径... - >选择部署程序集(左侧)。 在这里添加你的罐子,并在部署时包含它们。

相关问题