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

标签 java eclipse google-app-engine jar classpath

今天和昨天我花了好几个小时来寻找这个问题的解决方案,所以我决定在这里解决它,尽管这看起来是一个愚蠢的问题。

情况:我在 Eclipse Java EE 中设置了一个 Google AppEngine 项目。它已存在数周,一切运行良好,我可以毫无问题地部署到 App Engine 并在 Eclipse 中进行测试。

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

我做了什么:

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

发生了什么:一切顺利,我可以导入类并从中创建子类而不会出现错误。因此很明显,Eclipse 识别了这些类的存在,并且 Eclipse 成功导入了它们。

然后我尝试构建它( Debug模式)并得到以下错误(我也用 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 文件如下所示:

<?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 文件夹中。我的文件放在一个单独的文件夹中,但没用。
  • 我执行了 Source > Clean Up and Source > Manage imports 并且成功了。

最佳答案

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

关于java - 在 Eclipse (App Engine) 项目中包含 JAR 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8285472/

相关文章:

java - 注释生成的 Java 源可为空性(适用于 Kotlin)

java - 折线未显示在 2 个位置之间,但显示时间和距离

java - 使用 JAVA 查询 SQL - 没有任何反应

java - 通过eclipse CallHierarchy获取IMethod的方法调用

python - 断言错误 : No api proxy found for service "urlfetch"

java - 如何在 Java Play Framework 中记录请求和响应

java - 弗林克 SQL : Use changelog stream to update rows in Dynamic Table

c++ - 更改字符串中的多个字符 C++

java - 如何从非 GWT(但 Java)gapplication 在服务器上调用 GWT RPC 方法?

java - 创建时数据存储写入过多