Вызывается: java.lang.ClassNotFoundException: org.apache.commons.lang3.builder.EqualsBuilder - PullRequest
0 голосов
/ 05 октября 2018

Пока что я скачал Apache Commons library, извлек библиотеку
commons-lang3-3.8.1.jar в Java\jdk1.8.0_172\jre\lib\ext.

Теперь я создал класс с двумя полями и хочу сравнить два объекта, используя ob1.equals (оЬ2).Методы equals и hashCode были переопределены, и я получаю ошибку Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/builder/EqualsBuilder при время выполнения .

import java.util.*;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;

    class key{

        int end;
        LinkedList<Integer> via = new LinkedList<>();
        key(int x,LinkedList<Integer> ob){
            this.end = x;
            this.via = ob;
        }

        @Override
        public int hashCode(){

            return new HashCodeBuilder().append(end).append(via).toHashCode();

        }

        @Override
        public boolean equals(Object obj)
        {
            if(!(obj instanceof key))
                return  false;
            if(this==obj)
                return true;
            key o=(key)obj;
            return new EqualsBuilder().append(end,o.end).append(via,o.via).isEquals();
        }


    }

    class main{

        public static void main(String[] args)
        {

            key ob1 = new key(12,new LinkedList<Integer>(Arrays.asList(1,2,3)));
            key ob2 = new key(12,new LinkedList<Integer>(Arrays.asList(1,2,3)));

            System.out.println(ob1.equals(ob2));  //expecting true
        }



    }

Подробности ошибки приведены ниже.

Exception in thread "main" java.lang.NoClassDefFoundError: 

org/apache/commons/lang3/builder/EqualsBuilder
        at key.equals(test.java:29)
        at main.main(test.java:43)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.builder.EqualsBuilder
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
        ... 2 more

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

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Потратив часы на эту проблему, я наконец исправил ее, установив переменную CLASSPATH.Я попытался использовать команду -cp, но, к сожалению, это не сработало для меня.Если мы сделаем это явно, вам не нужно указывать значение переключателя «-cp» или «-classpath» для компилятора java и интерпретатора java, поскольку они уже будут знать обновленный путь к классам.

Вкл.На моем компьютере с Windows я установил переменную CLASSPATH следующим образом:

set CLASSPATH=/coding @October\lib\commons-lang3-3.8.1.jar;.

В настоящее время я нахожусь в каталоге coding @October.Файл commons-lang3-3.8.1.jar находится в каталоге coding @October\lib. Файл myapp.java находится в каталоге coding @October.

enter image description here

Послеустановив classpath, я могу затем скомпилировать и выполнить myapp.java с помощью команды javac myapp.java напрямую, а затем java myapp, чтобы выполнить скрипт.

0 голосов
/ 05 октября 2018

Вы поместили банку в правильный jre\lib\ext относительный путь ... но он будет работать только в том случае, если команда java, которую вы запускаете, приходит из каталога jre\bin того же пути jre, где вы произвели изменение,

Если вы скопировали правильный jar-файл в каталог расширений, но получили это исключение, это, скорее всего, означает, что при запуске вашей программы вы не используете JRE, в которой вы сделали изменение, а другое.
Команда java из переменной PATH env, скорее всего, не относится к расширенной JRE.Вы можете отобразить PATH в своей оболочке, чтобы проверить это.
Так что либо установите PATH с помощью java home path расширенной JRE, либо просто введите команду java, указав абсолютный путь, такой как /foo/jre/bin/java main.
Это должно (не сказать, должно) работать.

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