在Eclipse(App Engine)项目中包含JAR文件 [英] Including JAR files in Eclipse (App Engine) project

查看:94
本文介绍了在Eclipse(App Engine)项目中包含JAR文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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





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



我做了什么:




  • 下载JAR文件。

  • 将它们放在PROJECT / lib文件夹中。

  • 选择它们并右键单击并单击构建路径>添加以构建路径。



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



然后我尝试构建它(调试模式)并得到以下错误(一个我也有JSON):

  2011年11月27日11:57:48 com.google.apphosting.utils.jetty。 JettyLogger警告
警告:chartDataServlet失败:java.lang.NoClassDefFoundError:com / google / visualization / datasource / DataSourceServlet
2011年11月27日上午11:57:48 com.google.apphosting.utils.jetty。 JettyLogger警告
警告:com.google.appengine.tools.development.DevAppEngineWebAppContext@727db937 {/,/ Volumes / Data / eclipse_workspace / kulStats / war}失败:java.lang.NoClassDefFoundError:com / google / visualization / datasource / DataSourceServlet
2011年11月27日11:57:48 com.google.apphosting.utils.jetty.JettyLogger警告
警告:JettyContainerService失败$ ApiProxyHandler @ 409bad4f:java.lang.NoClassDefFoundError:com / google / visualization / datasource / DataSourceServlet
2011年11月27日11:57:48 com.google.apphosting.utils.jetty.JettyLogger警告
警告:启动处理程序时出错
java.lang.NoClassDefFoundError:com / google / visualization / datasource / DataSourceServlet
在java.lang.ClassLoader.defineClass1(本机方法)
在java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
在java.lang.ClassLoader.defineClass(ClassLoader。 java:615)
在java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
在java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
在java.net .URLClassLoader.access $ 000(URLClassLoader.java:58)
在java.net.URLClassLoader $ 1.run(URLClassLoader.java:197)
在java.security.AccessController.doPrivileged(本机方法)
在java.net.URLClassLoader.findClass(URLClassLoader.java:190)
在java.lang.ClassLoader.loadClass(ClassLoader.java:306)
在com.google.appengine.tools.development .IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
在java.lang .ClassLoader.loadClass(ClassLoader.java:247)
在org.mortbay.util.Loader.loadClass(Loader.java:91)
在org.mortbay.util.Loader.loadClass(Loader.java :71)
在org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
在org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
在org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
在org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
在org。 mortbay.jetty.servlet.Context.startContext(Context.java:140)
在org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
在org.mortbay.jetty。 handler.ContextHandler.doStart(ContextHandler.java:517)
在org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
在org.mortbay.component.AbstractLifeCycle.start( AbstractLifeCycle.java:50)
在org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
在org.mortbay.component.AbstractLifeCycl e.start(AbstractLifeCycle.java:50)
在org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
在org.mortbay.jetty.Server.doStart(Server。 java:224)
在org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:191)
com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239)
com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146)
com.google.appengine.tools.development.DevAppServerMain $ StartAction.apply(DevAppServerMain.java:164)
com.google.appengine.tools.util.Parser $ ParseResult.applyArgs(Parser。 java:48)
com.google.appengine.tools.development.DevAppServerMain。< init>(DevAppServerMain.java:113)
com.google.appengine.tools.development.DevAppServerMain.main (DevAppServerMain.java:89)

造成:j ava.lang.ClassNotFoundException:com.google.visualization.datasource.DataSourceServlet
在java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)
在java.security.AccessController.doPrivileged(本机方法)
在java.net.URLClassLoader.findClass(URLClassLoader.java:190)
在java.lang.ClassLoader.loadClass(ClassLoader.java:306)
在com.google.appengine。 tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
在java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 35更多

我不知道它是否打印出与削减而不是点的类的事实是问题的一部分: COM /谷歌/可视/数据源/ DataSourceServlet
在第二部分,他使用点。



我在很长一段时间内找到了一个问题,并且听到有关classpath文件的内容。我的.classpath文件如下所示:

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

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



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



有没有人有一个想法如何解决?
摘要:Eclipse识别导入的JAR,但由于某些原因构建失败...



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




  • JAR应该在WEB-INF / lib

  • JAR不应该在lib文件夹中,全部在根WEB-INF / lib文件夹中。我有一个单独的文件夹我没有工作。

  • 我做了源>清理和源代码>管理导入,它的工作。


    • 解决方案

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


      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.

      解决方案

      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.

      这篇关于在Eclipse(App Engine)项目中包含JAR文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆