Я искал решение этой проблемы в течение нескольких часов сегодня и много часов вчера, поэтому я решил обратиться к нему здесь, хотя это кажется глупой проблемой.
Ситуация: У меня есть настройка проекта Google AppEngine в Eclipse Java EE. Он там в течение нескольких недель все работает нормально, я могу развернуть App Engine и протестировать в Eclipse без проблем.
Теперь мне нужно добавить пакеты JAR для f.e. JSON и API визуализации Google. Я попробовал JSON неделю назад, и поскольку он не удался, я просто загрузил исходные файлы и добавил их в свой собственный источник. Но теперь с визуализацией, это слишком много исходных файлов, поэтому мне нужны рабочие 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 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
не существует.
Ow, еще одна вещь: я нашел документы об App Engine специально, и они иногда упоминали папку war/WEB-INF/lib
, поэтому я тоже попробовал поставить ее там. Конечно, после удаления из пути сборки и чтения после перемещения. (Это версия файла classpath, который я вставил).
Есть ли у кого-нибудь идея, как это можно решить? Реферат: Eclipse распознает импортированные JAR, но по какой-то причине сборка завершилась неудачей...
EDIT: решение Я нашел следующее:
- JAR должны быть в WEB-INF/lib
- JAR не должны находиться в папках lib, все в корневой папке WEB-INF/lib. У меня была моя в отдельной папке, и это не сработало.
- Я сделал Source > Clean Up and Source > Управлял импортом и работал.