Как решить Eclipse NoClassDefFoundError во время выполнения

Я экспериментирую с написанием привязки openHab2, написанной на java. Я парень C++, и java для меня новичок. Код нарушения выглядит следующим образом:

import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
...
@Override
public void initialize() {
    ...
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    ...
}

Я добавил org.apache.httpcomponents.htpclient_4.5.2.v20170210-0925.jar в путь сборки как внешний jar, и программа собирается без проблем. В этом проекте в качестве системы сборки используется Maven, с которым я тоже не знаком, поэтому я добавил:

  <dependencies>
    <dependency>
        <groupId>org.apache.httpcomponent</groupId>
        <artifactId>httpclient</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <scope>runtime</scope>
    </dependency>
  </dependencies>

в файл pom.xml.

Когда я запускаю систему, я получаю эту ошибку:

2018-05-20 09:51:38.574 [ОШИБКА] [.i.c.AbstractInvocationHandler:101] — Произошла ошибка при вызове метода «ThingHandler.initialize ()» на «org.openhab.binding.testbinging.internal.TestBingingHandler@728656fc» : org/apache/http/impl/client/BasicCredentialsProviderjava.lang.NoClassDefFoundError: org/apache/http/impl/client/BasicCredentialsProvider в org.openhab.binding.testbinging.internal.TestBingingHandler.initialize(TestBingingHandler.java:63)

2018-05-20 09:51:38.576 [ОШИБКА] [.c.thing.internal.ThingManager:700] — Исключение при инициализации обработчика вещи «testbinging:sample:0ac3dcf3»: org/apache/http/impl/client /BasicCredentialsProviderjava.lang.NoClassDefFoundError: org/apache/http/impl/client/BasicCredentialsProvider

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

Я использую версию eclipse-oxygen Oxygen.3a Release (4.7.3a), идентификатор сборки: 20181405.1200 и $ mvn -version Apache Maven 3.3.9 Дом Maven: /usr/share/maven Версия Java: 1.8.0_171, поставщик: Домашняя страница Oracle Corporation Java: /usr/lib/jvm/java-8-openjdk-amd64/jre

Спасибо, Стив. Язык по умолчанию: en_US, кодировка платформы: UTF-8. Название ОС: «linux», версия: «4.9.0-5-amd64», архитектура: «amd64», семейство: «unix».


person zephod    schedule 20.05.2018    source источник
comment
Итак, вы сделали и то, и другое, добавили JAR и использовали Maven? Попробуйте удалить JAR и использовать только Maven (возможно, существует несоответствие версии между JAR-файлами интерфейса и реализации). Как именно вы запускаете систему?   -  person howlger    schedule 21.05.2018
comment
Я удалил внешние банки, но проблемы остались. Смотрите комментарии в ответе ниже.   -  person zephod    schedule 22.05.2018


Ответы (1)


Это потому, что ваши зависимости являются временем выполнения:

<scope>runtime</scope>

Вам нужно либо изменить его на:

 <scope>compile</scope>

Или удалите строку области действия, так как это область действия по умолчанию.

Зависимости времени выполнения не используются во время компиляции. Вы не можете прочитать об этом больше: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

person Mirna De Jesus    schedule 20.05.2018
comment
Но это ошибка времени выполнения, а не ошибка времени компиляции. Сборка в порядке. Я пробовал вообще без прицела и получил тот же результат. Я проверю ссылку, которую вы разместили. - person zephod; 21.05.2018
comment
Если вы используете maven, вам не нужно включать зависимости в виде внешних банок. Зависимости, которые вы включаете в pom, будут добавлены в ваш путь к классам. Я думаю, что первое, что нужно сделать, это удалить внешнюю банку из пути к классам, а затем добавить область действия и версию каждой зависимости к вашему pom. Можете ли вы попробовать это? ‹dependency› ‹groupId›org.apache.httpcomponents‹/groupId› ‹artifactId›httpclient‹/artifactId› ‹version›4.5.5‹/version› ‹/dependency› - person Mirna De Jesus; 21.05.2018
comment
Если я удаляю внешний jar-файл из пути сборки, затем очищаю и перестраиваю проект, я получаю ошибки сборки. Я все равно пытался запустить, но получил ту же ошибку времени выполнения, что и раньше. - person zephod; 21.05.2018
comment
Вы добавили часть версии ?? Какие ошибки сборки вы получаете? - person Mirna De Jesus; 21.05.2018
comment
Да, я добавил часть версии. Я получаю Импорт org.apache не может быть разрешен для каждой из строк импорта, а BasicCredentialsProvider не может быть разрешен к типу, а CredentialsProvider не может быть разрешен к типу. - person zephod; 21.05.2018
comment
Если у вас возникла проблема с компиляцией, либо объявленная зависимость не разрешается, либо вы объявляете неправильную зависимость. Вы обновили проект maven после этих изменений? stackoverflow.com/questions /2555845/ - person Mirna De Jesus; 21.05.2018
comment
Я искал, как обновить проект maven, и обнаружил несколько команд maven из командной строки, в частности компиляцию mvn, которая выводит Eclipse из поля зрения и предоставляет гораздо более подробный вывод. Таким образом, запуск компиляции mvn показывает, что сборка выполнена успешно. Странно, что в выводе нет упоминания о httpclient. Если я попытаюсь выполнить сборку из Eclipse, я все равно получу те же ошибки времени компиляции, что и раньше. - person zephod; 22.05.2018
comment
Ну, я слишком рано написал. Если я запускаю mvn clean перед компиляцией mvn, я снова получаю ошибки. Однако я думаю, что нашел виновного. Если я запускаю mvn -X compile, я вижу в выводе следующее: !ENTRY org.eclipse.equinox.p2.publisher.eclipse 4 0 2018-05-22 07:23:49.882 !СООБЩЕНИЕ Невозможно получить сервис PluginConverter во время генерации для : /home/steve/.m2/repository/org/apache/httpcomponents/httpclient/4.5.5/httpclient-4.5.5.jar. - person zephod; 22.05.2018