当前位置: 首页 > 面试题库 >

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

汪晨
2023-03-14
问题内容

我一直在寻找这个问题的解决方案,今天已经花费了多个小时,而昨天已经花费了许多个小时,所以我决定在这里解决,尽管这似乎是一个愚蠢的问题。

情况:我在Eclipse Java EE中设置了Google AppEngine项目。在这里已经有好几个星期了,一切运行正常,我可以部署到App
Engine并在Eclipse中进行测试,而不会出现问题。

现在,我需要添加用于fe JSON支持和Google Visualization
API的JAR包。我一周前尝试了JSON,由于失败,我只下载了源文件并将其添加到自己的源中。但是现在有了Visualizations,它的源文件太多了,所以我需要工作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.<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(网络应用程序存档),因此库jar需要位于WEB-INF /
lib中。您应该确保您的罐子在那里,然后将这些罐子添加到您的Eclipse构建路径中。尝试对项目执行“清理”操作,然后重新构建它以确保库位于软件包中。



 类似资料:
  • 我在eclipse中有一个java项目,我在ec利pse之外使用ivy依赖项管理器,所以我的目录结构中充满了各种jar文件。有没有一种简单的方法将我的eclipse项目的路径指向常春藤目录并拾取所有jar文件? 我试图避免将每个单独的jar拉到我的eclipse项目目录中,并希望有更好的方法。

  • 我试图在我的“Java”gradle项目中包含一个本地jar文件。我已经在Project的“main/resource”文件夹中添加了jar文件。在Build.Gradle中添加了以下行:-

  • 问题内容: 我有一个本地.json文件。我不希望它在服务器上,我只希望它包含在我的应用程序中。我尝试将其直接粘贴到项目中的Eclipse中,但遇到FileNotFoundException异常,也尝试将其粘贴到Windows资源管理器/ Finder的工作区文件夹中,并得到相同的异常。我应该放在哪里? 谢谢! 问题答案: 您应该将文件放在Android项目的或目录中。从那里,您可以使用或检索它。

  • 问题内容: 大家好。我正在为一个学校项目工作,在该项目中,我们获得了.class文件,但没有提供包含在我们代码中的源代码。我正在使用Eclipse,并且希望将文件包含在我的项目中,以便可以从中实例化对象并使用它。 该文件是TokenizerImpl.class,我想这样使用它: 我将文件放在项目文件夹中,Eclipse表示“ TokenizeImpl无法解析为类型”,我认为这意味着它找不到类或源。

  • 我有一个结构如下的maven项目: 我希望maven jar插件在构建jar文件时打包到数据库文件夹中。我尝试过包含这里概述的内容:https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html,但它找不到目录“../database”(或../../database或../../../database

  • 我们正在尝试使用java webstart开发一个打印应用程序。我们使用eclipse将jar创建为普通jar文件。我们的应用程序需要外部库来连接数据库、将数据转换为字节等。 我们以前可以通过将必要的JAR放入jre文件夹的/ext/目录来实现这一点。然而,这导致了与tomcat服务器的库冲突,所以我们希望避免这种方法。 我们还尝试将项目导出为可运行的jar,因为所需的库也已打包在jar中。但是当