Включение JAR-файлов в проект Eclipse (App Engine) - PullRequest
17 голосов
/ 27 ноября 2011

Я искал решение этой проблемы несколько часов сегодня и много часов вчера, поэтому решил решить ее здесь, хотя это кажется глупой проблемой.

Ситуация: у меня есть проект Google AppEngineнастройка в Eclipse Java EE.В течение нескольких недель все работает нормально, я могу развернуть в App Engine и протестировать в Eclipse без проб.

Теперь мне нужно добавить пакеты JAR для поддержки JSON и API визуализации Google.Я попробовал JSON неделю назад, и потому что это не удалось, я просто скачал исходные файлы и добавил их в свой собственный источник.Но теперь с визуализацией, это слишком много исходных файлов, поэтому мне нужно, чтобы 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 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.Мой файл .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, поэтому я тоже попытался поместить ее туда.Конечно после удаления из пути сборки и чтения после переезда.(Это та версия файла classpath, которую я вставил).

У кого-нибудь есть идеи, как это можно решить?Описание: Eclipse распознает импортированные JAR-файлы, но сборка по какой-то причине завершается неудачно ...

РЕДАКТИРОВАТЬ: решение Я обнаружил следующее:

  • JAR-файлы должны находиться вWEB-INF / lib
  • JAR-файлы не должны находиться в папках внутри lib, все в корневой папке WEB-INF / lib.У меня был мой в отдельной папке, и это не сработало.
  • Я сделал Source> Clean Up and Source> Управление импортом, и это сработало.

Ответы [ 5 ]

21 голосов
/ 27 ноября 2011

Вы на правильном пути. Поскольку приложение, развернутое в appengine, упаковано как war (архив веб-приложения), библиотечные файлы должны быть в WEB-INF / lib. Вы должны убедиться, что ваши jar есть, а затем добавить эти jar на путь сборки eclipse. Попробуйте выполнить «чистую» операцию над проектом и пересобрать его, чтобы убедиться, что библиотеки находятся в пакете.

4 голосов
/ 14 ноября 2012

это решение, которое:

  • скопировать исходный код (файл .jar) в папку war / WEB-INF / lib
2 голосов
/ 11 августа 2013

Вам все еще нужно добавить файлы jar в путь сборки java, чтобы избежать ошибок компиляции после добавления файлов в папку war / WEB-INF / lib!

1 голос
/ 07 октября 2013

Скопируйте и вставьте файлы .jar в war / WEB-INF / lib, а затем перейдите в Свойства (проекта в Eclipse) -> Путь сборки Java -> Добавить JAR -> Выберите связанные файлы .jar изтекущий проект.Вы должны быть все готово!

0 голосов
/ 28 апреля 2015

Может быть, "немного" слишком поздно для этого, но в затмении вам не нужно копировать вручную.Щелкните правой кнопкой мыши по проекту -> Путь сборки -> Настроить путь сборки ... -> выберите Сборка развертывания (слева).Добавьте сюда свои банки, и они будут включены при развертывании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...