由于:java.lang.ClassNotFoundException: org.apache.commons.lang3.builder.EqualsBuilder引起的问题

3
到目前为止,我已经下载了 Apache Commons library 并提取了库中的 commons-lang3-3.8.1.jar 文件至 Java\jdk1.8.0_172\jre\lib\ext 文件夹中。
现在,我创建了一个类,其中包含两个字段,我想使用 ob1.equals(ob2) 方法来比较两个对象。已经重写了方法 equalshashCode,但是在运行时出现了错误: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


1
你应该尝试将commons-lang3-3.8.1.jar放在类路径上。更多细节请参见此链接 - Ivan Kulezic
@IvanKulezic 我已经尝试将commons-lang3-3.8.1.jar放在类路径上,但仍然出现相同的错误。 - suvojit_007
2
我通过使用以下命令进行编译成功地使其工作: javac -cp commons-lang3-3.8.1/commons-lang3-3.8.1.jar:. key.java 然后使用以下命令运行它: java -cp commons-lang3-3.8.1/commons-lang3-3.8.1.jar:. main。 输出为true。 - Ivan Kulezic
3个回答

1
经过数小时的努力,我终于通过设置CLASSPATH变量解决了这个问题。我尝试使用-cp命令,但不幸的是它对我没有用。如果我们明确地这样做,那么您就不需要为java编译器和java解释器提供"-cp"或"-classpath"开关值,因为它们已经知道了更新后的类路径。
在我的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

设置完类路径后,我可以直接通过 javac myapp.java 命令编译并执行 myapp.java,然后使用 java myapp 命令来执行脚本。

我得到了这个错误,因为我对javac使用了-cp参数,但是没有对java使用:java -cp commons-lang3-3.9.jar:. MyApp - John

0
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    at io.appium.java_client.internal.ElementMap.getElementClass

答案:添加Selenium jar“commons-lang3-3.8.1”以解决此问题。

1
目前你的回答表述不清。请进行[编辑],添加额外的细节以帮助他人理解如何解决问题。你可以在帮助中心找到更多关于如何撰写好答案的信息。 - Community

0

您将jar文件放置在了正确的jre\lib\ext路径下...但是它只会在您运行的java命令来自相同的jre路径下的jre\bin目录时才会起作用。

如果您已将正确的jar文件复制到扩展目录,但仍然出现此异常,那么很可能是因为当您运行程序时,您并未使用进行更改的JRE,而是使用其他JRE。
PATH环境变量中的java命令很可能不是指向您扩展的JRE。您可以在shell中显示PATH以进行检查。
因此,要么设置PATH为您扩展的JRE的java主目录路径,要么只需通过指定绝对路径来运行java命令,例如/foo/jre/bin/java main
这应该(不说必须)能够正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接