2011-11-27 85 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中你不必手動複製。 右鍵單擊項目 - >構建路徑 - >配置構建路徑... - >選擇部署程序集(左側)。 在這裏添加你的罐子,並在部署時包含它們。

相關問題