Подтвердить что ты не робот

Java ClassNotFoundException с зависимостью maven

Я получаю исключения ClassNotFoundException и NoClassDefFoundError когда я пытаюсь запустить свое приложение с помощью определенной пользователем зависимости.

Я добавил свою maven-зависимость для рассматриваемого jar файла в мой файл pom.xml со следующим объявлением:

<dependency>
    <groupId>spy</groupId>
    <artifactId>spymemcached</artifactId>
    <version>2.8.4</version>
    <scope>provided</scope>
</dependency>

Это добавило соответствующий файл JAR в мою папку Maven Dependencies в Eclipse. Я могу получить доступ к классам в коде, но я получаю упомянутые исключения, как только я запускаю приложение.

На jar ссылается мой путь сборки Java под зависимостями Maven:

Java build path

Мой локальный репозиторий maven добавлен в мой путь к классам:

screenshot

Когда я пытаюсь запустить приложение, я получаю следующие два исключения:

java.lang.NoClassDefFoundError: Lnet/spy/memcached/MemcachedClient;

java.lang.ClassNotFoundException: net.spy.memcached.MemcachedClient

Может кто-то указать мне верное направление?

4b9b3361

Ответ 1

Измените provided на compile

При условии

Это похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса Servlet и связанных с ним API-интерфейсов Java EE для области видимости, поскольку веб-контейнер предоставляет эти классы. Эта область видимости доступна только в пути к компиляции и тестированию и не является транзитивной.

Ответ 2

<scope>provided</scope>

"Предоставленная" область подразумевает, что зависимости должны быть доступны только на этапе компиляции, и они будут доступны в другом месте во время выполнения, и Maven не должен упаковывать их вместе с остальными банками и классами текущего приложения.

Ваша зависимость не кажется "предоставленной" областью. Удалите эту область из определения вашей зависимости, и банки будут присутствовать в вашей упаковке jar/war/ear.

Ответ 3

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

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

Наконец, я смог его решить, перейдя на вкладку серверов → щелкните правой кнопкой мыши на Tomcat v8.0 → найдите местоположение развертывания

это приведет вас к папке temp, например

.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps

то вы перейдете к папке проекта → WEB-INF → lib → здесь я узнал, что банку из библиотеки, которая выдавала ошибку, не было, поэтому я просто скопировал ее из .m2\repository

Перезагрузили сервер, и он снова начал работать как обычно.

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

Ответ 4

Добавьте ниже зависимости, это решит проблему.

<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-jvm-deps -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-jvm-deps</artifactId>
    <version>1.0.3</version>
    <scope>provided</scope>
</dependency>

Ответ 5

Ответ несколько связан с вашей проблемой, но все же может помочь другим.
В моем случае недостаточно было добавить <scope>compile</scope> к зависимости. Я также должен был добавить <packaging>jar</packaging> к целевому модулю pom.