为什么我在 Java 中收到 NoClassDefFoundError?

Why am I getting a NoClassDefFoundError in Java?

提问人:John Meagher 提问时间:8/29/2008 最后编辑:Duncan JonesJohn Meagher 更新时间:11/9/2023 访问量:1094743

问:

当我运行我的 Java 应用程序时,我得到了一个。造成这种情况的典型原因是什么?NoClassDefFoundError

Java noclassdeffoundError

评论

1赞 frank hadder 8/29/2008
我相信如果您没有使用正确的语法运行 java 程序,也会发生这种情况。例如,您必须从具有完整包名称(即 my.package.myClass)的根 bin 文件夹中调用您的类。如果可以的话,我会更具体,但我不是一个 java 人。我只记得搞砸了几次。

答:

304赞 Mocky 8/29/2008 #1

当代码依赖于一个类文件,并且该类文件在编译时存在但在运行时找不到时,就会导致这种情况。查找生成时和运行时类路径的差异。

评论

1赞 CenterOrbit 10/21/2014
将源文件放在错误的命名空间/包下时,我发生了此错误。我想我可以把它放在任何地方,编译器很高兴。事实证明,我也应该更加勤奋地让运行时感到高兴。
2赞 James M. Lay 4/25/2016
当我的服务器在文件上传过程中内存不足时,我曾经遇到过这个错误。每次我尝试上传时,我都会收到不同的错误。最终它告诉我我没有足够的堆空间。
133赞 Dave L. 9/1/2016
这个答案不一定是真的,会误导很多人!请参阅下面 Jared 的更好答案。
5赞 Saurabh Patil 7/31/2017
@DaveL。谢谢!Jared 的 400+ 赞成票的答案远低于!一个答案是 -4 up(down?)选票远远高于它。SO 的答案排序逻辑有些可疑。
1赞 Ryan D 1/10/2018
这对某人来说是一个很长的机会,但我遇到了这个错误,因为有问题的类包含一个用无效字符初始化的 SimpleDateFormat(我在中间有 T 而不是“T”)。
34赞 shsteimer 8/29/2008 #2

我发现有时当使用运行时发现的不兼容版本的类编译代码时,我会得到 NoClassDefFound 错误。我记得的具体实例是 apache 轴库。我的运行时类路径上实际上有 2 个版本,它选择了过时和不兼容的版本,而不是正确的版本,从而导致 NoClassDefFound 错误。这是在一个命令行应用程序中,我使用了与此类似的命令。

set classpath=%classpath%;axis.jar

我能够通过使用以下方法让它选择正确的版本:

set classpath=axis.jar;%classpath%;

评论

4赞 duvo 11/25/2014
有同样的问题。原来我用 Java7 编译了 war 文件,但我的 Tomcat 安装使用的是 Java6。我必须更新我的环境变量
4赞 supernova 10/20/2015
如果这种情况发生,那么我会说 Java 一团糟。+2,如果这是真的。目前无法验证。如果发现 true 将再次执行 +1(在评论中)
1034赞 Jared 4/22/2011 #3

虽然这可能是由于编译时和运行时之间的类路径不匹配,但事实并非如此。

在这种情况下,重要的是要将两个或三个不同的例外情况直接记在脑海中:

  1. java.lang.ClassNotFoundException 此异常表示在类路径上找不到该类。这表明我们正在尝试加载类定义,并且类路径上不存在该类。

  2. java.lang.NoClassDefFoundError 此异常表示 JVM 在其内部类定义数据结构中查找类的定义,但未找到它。这与说它不能从类路径加载不同。通常,这表明我们之前尝试从类路径加载一个类,但由于某种原因它失败了 - 现在我们尝试再次使用该类(因此需要加载它,因为它上次失败了),但我们甚至不会尝试加载它,因为我们之前加载它失败了(并且有理由怀疑我们会再次失败)。较早的故障可能是 ClassNotFoundException 或 ExceptionInInitializerError(指示静态初始化块中的故障)或任何其他问题。关键是,NoClassDefFoundError 不一定是类路径问题。

评论

59赞 Thomas 2/21/2013
感谢您提及 NoClassDefFoundError 的原因,这对我有很大帮助!在我的情况下,之前抛出了 ExceptionInInitializerError,这就是我发现静态块中错误的方式。
0赞 Vikram 7/20/2013
@Jared,当我得到时,它将被归类为哪一类错误?Error: Could not find or load main class
0赞 Jared 2/10/2014
@Pops:使语言更详细,以指定动词“try”的宾语:)
1赞 eckes 1/16/2015
@Vikram“找不到或加载主类”不是 Java 异常,它是由启动器(检查 JAR 和 main 清单属性)引起的。
4赞 coladict 2/22/2018
当类具有引发错误或异常的静态初始化时,也会引发 ClassNotFoundException。他们可能应该为该事件选择一个不同的名称。
155赞 xli 2/14/2015 #4

下面是用于说明的代码。详细解释请看 Jared 的回答java.lang.NoClassDefFoundError

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo {
    public static void main(String[] args) {
        try {
            // The following line would throw ExceptionInInitializerError
            SimpleCalculator calculator1 = new SimpleCalculator();
        } catch (Throwable t) {
            System.out.println(t);
        }
        // The following line would cause NoClassDefFoundError
        SimpleCalculator calculator2 = new SimpleCalculator();
    }

}

SimpleCalculator.java

public class SimpleCalculator {
    static int undefined = 1 / 0;
}

评论

4赞 ikamen 1/25/2018
原因是在第一次尝试后,jvm 已经知道它不会工作并第二次抛出不同的异常?
1赞 ᴠɪɴᴄᴇɴᴛ 9/28/2018
@ikamen 显然,它在除以零后将不成功的类初始化存储在某个地方?是否有人参考了此行为的官方文档?SimpleCalculator
7赞 harperska 5/5/2019
@PhilipRego 不确定“纯”NoClassDefFoundError 是什么意思。第一次调用时,您会收到由 ArithmeticException 引起的 ExceptionInInitializerError。第二次调用时,您会收到一个 NoClassDefFoundError,与其他任何错误一样纯。关键是,您可能会因为 SimpleCalculator.class 在运行时不在类路径上以外的原因而获得 NoClassDefFoundError。new SimpleCalculator()new SimpleCalculator()
6赞 Nikhil Sahu 8/10/2015 #5

我正在将 Spring FrameworkMaven 一起使用,并在我的项目中解决了这个错误。

类中存在运行时错误。我以整数形式读取属性,但是当它从属性文件中读取值时,它的值是双倍的。

Spring 没有给我运行时失败的哪一行的完整堆栈跟踪。 它只是说.但是当我将其作为本机 Java 应用程序执行(将其从 MVC 中取出)时,它给出了真正的原因,这就是我跟踪错误的方式。NoClassDefFoundErrorExceptionInInitializerError

@xli的回答让我深入了解了我的代码中可能存在的问题。

评论

2赞 Bartłomiej Zieliński 1/18/2016
在对 Servlet 进行编程时,我也发生了同样的事情(实际上是由 ,这是由 )。这有点误导,不是吗?我知道他们可能有他们这样做的理由,但至少有一个小提示就太好了,那是另一个例外的结果,不需要推断它。再扔一次会更清楚。有时两者之间的联系可能并不那么明显。NoClassDefFoundErrorExceptionInInitalizerErrorDateTimeParseExceptionNoClassDefFoundErrorExceptionInInitializerError
5赞 codeDr 9/9/2015 #6

当运行时类加载器加载的类无法访问 java rootloader 已加载的类时,我得到 NoClassFoundError。因为不同的类装入器位于不同的安全域中(根据 java),所以 jvm 不允许在运行时装入器地址空间中解析已经由 rootloader 加载的类。

使用“java -javaagent:tracer.jar [YOUR java ARGS]”运行程序

它生成显示已加载类的输出,以及加载该类的加载程序环境。跟踪无法解析类的原因非常有帮助。

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

评论

1赞 avgvstvs 2/9/2018
链接已死。尝试存档版本:web.archive.org/web/20131216000019/https://blogs.oracle.com/...
9赞 Ram Patra 9/16/2015 #7

这是我迄今为止找到的最好的解决方案

假设我们有一个名为 包含类的包:org.mypackage

  • HelloWorld(主类)
  • 支持类
  • Util类

定义此包的文件物理存储在目录下(在 Windows 上)或(在 Linux 上)。D:\myprogram/home/user/myprogram

文件结构将如下所示:在此处输入图像描述

当我们调用 Java 时,我们指定要运行的应用程序的名称:.但是,我们还必须告诉 Java 在哪里查找定义我们包的文件和目录。因此,要启动程序,我们必须使用以下命令:org.mypackage.HelloWorld在此处输入图像描述

-1赞 sudar 7/15/2016 #8

我也有同样的问题,而且我库存了好几个小时。

我找到了解决方案。就我而言,因此定义了静态方法。JVM 无法创建该类的另一个对象。

例如

private static HttpHost proxy = new HttpHost(proxyHost, Integer.valueOf(proxyPort), "http");
4赞 Aram Paronikyan 7/27/2016 #9

下面的技术帮助了我很多次:

System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());

其中 TheNoDefFoundClass 是可能由于对程序使用的同一库的旧版本的首选而“丢失”的类。这种情况最常发生,当客户端软件被部署到一个占主导地位的容器中时,它有自己的类加载器和最流行的库的大量旧版本。

51赞 Aftab 8/11/2016 #10

Java 中的 NoClassDefFoundError

定义:

  1. Java 虚拟机无法在运行时找到在编译时可用的特定类。

  2. 如果某个类在编译时存在,但在运行时在 java 类路径中不可用。

在此处输入图像描述

例子:

  1. 该类不在 Classpath 中,没有确定的方法来了解它,但很多时候您可以查看打印 System.getproperty(“java.classpath”),它将从那里打印类路径,您至少可以了解实际的运行时类路径。
  2. NoClassDefFoundError 的一个简单示例是 class 属于丢失的 JAR 文件,或者 JAR 未添加到类路径中,或者有时 jar 的名称已被某人更改,例如在我的案例中,我的一位同事已将tibco.jar更改为 tibco_v3.jar 并且程序失败并显示 java.lang.NoClassDefFoundError,我想知道出了什么问题。

  3. 只需尝试使用显式 -classpath 选项运行您认为可以工作的类路径,如果它有效,那么这肯定是一个简短的迹象,表明有人正在覆盖 java classpath。

  4. JAR 文件的权限问题也可能导致 Java 中的 NoClassDefFoundError。
  5. XML 配置上的拼写错误也可能导致 Java 中的 NoClassDefFoundError。
  6. 当在包中定义的编译类在加载时不出现在同一个包中时,就像 JApplet 一样,它会在 Java 中抛出 NoClassDefFoundError。

可能的解决方案:

  1. 该类在 Java 类路径中不可用。
  2. 如果您在 J2EE 环境中工作,那么 Class 在多个 Classloader 中的可见性也可能导致 java.lang.NoClassDefFoundError,请参阅示例和场景部分进行详细讨论。
  3. 检查日志文件中的 java.lang.ExceptionInInitializerError。由于静态初始化失败导致的 NoClassDefFoundError 很常见。
  4. 因为 NoClassDefFoundError 是 java.lang.LinkageError 的子类,所以如果其中一个依赖项(如本机库)可能不可用,它也可能出现。
  5. 任何启动脚本都会覆盖 Classpath 环境变量。
  6. 您可能正在使用 jar 命令运行程序,并且未在清单文件的 ClassPath 属性中定义类。

资源:

解决 NoClassDefFoundError 的 3 种方法

java.lang.NoClassDefFoundError 问题模式

评论

1赞 J E Carter II 6/20/2017
很好的答案。我想我已经尝试了你建议的一切,但仍然有这个问题。由于 jar 与 spring 一起工作,我可以排除其中的一些,但似乎java.sql不喜欢(在我的情况下是 Hana 的 sap db 驱动程序)。
2赞 GRASBOCK 10/9/2019
它实际上被称为System.getproperty(“java.class.path”)
0赞 BeHappy 5/16/2021
问题仍未解决,但这是非常有用的信息。
3赞 Aykut Kllic 11/7/2016 #11

如果您有生成代码(EMF 等),则可能会有太多的静态初始化器占用所有堆栈空间。

请参阅堆栈溢出问题如何增加 Java 堆栈大小?

评论

0赞 Peter Mortensen 2/22/2018
“电磁场”?你是说MEF吗?
2赞 Aykut Kllic 2/24/2018
不。EMf 作为 Eclipse 建模框架。在汽车领域,我们在运行生成的代码时可能会遇到此错误。
0赞 ST7 6/19/2017 #12

如果有人因为错误而来到这里,就我而言,它是因为我使用了 log4j 2(但我没有添加它附带的所有文件)而产生的,并且一些依赖库使用了 log4j 1。解决方案是添加 Log4j 1.x 桥:log4j 2 附带的 jar。log4j 2 迁移中的详细信息。java.lang.NoClassDefFoundError: org/apache/log4j/Loggerlog4j-1.2-api-<version>.jar

1赞 manuelvigarcia 10/25/2017 #13

同一项目的两个不同签出副本

就我而言,问题在于 Eclipse 无法区分同一项目的两个不同副本。我有一个锁定在主干(SVN 版本控制)上,另一个一次在一个分支中工作。我尝试了工作副本中的一个更改作为 JUnit 测试用例,其中包括将一个私有内部类提取为一个独立的公共类,当它工作时,我打开项目的另一个副本来查看代码中需要更改的其他部分。在某个时候,突然出现抱怨私人内部阶级不在那里;双击堆栈跟踪将我带到了错误项目副本中的源文件。NoClassDefFoundError

关闭项目的主干副本并再次运行测试用例解决了这个问题。

-1赞 Pekmezli Dürüm 11/29/2017 #14

Java 无法在运行时找到类 A。 类 A 位于来自不同工作区的 maven 项目 ArtClient 中。 因此,我将 ArtClient 导入到我的 Eclipse 项目中。 我的两个项目使用 ArtClient 作为依赖项。 我将库引用更改为这些项目引用(构建路径 ->配置构建路径)。

问题就消失了。

1赞 Michael 2/5/2018 #15

我通过禁用所有模块的 preDexLibraries 解决了我的问题:

dexOptions {
        preDexLibraries false
        ...
0赞 Brent Bradburn 4/2/2018 #16

此错误可能是由未经检查的 Java 版本要求引起的。

就我而言,我能够通过使用 SDKMAN 从 Java 9 切换到 Java 8 来解决此错误,同时构建一个备受瞩目的开源项目。

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

然后执行全新安装,如下所述。


当使用 Maven 作为构建工具时,在禁用测试的情况下进行干净的“安装”构建有时会有所帮助,而且通常是令人欣慰的。

mvn clean install -DskipTests

现在,所有内容都已构建并安装完毕,您可以继续运行测试。

mvn test
1赞 ᴠɪɴᴄᴇɴᴛ 9/28/2018 #17

NoClassDefFoundError静态初始值设定项尝试加载运行时中不可用的资源包时,也可能发生这种情况,例如,受影响的类尝试从目录加载但不存在的属性文件。如果不抓住,有时您将无法看到完整的堆栈跟踪;为了克服这个问题,您可以暂时使用以下子句:META-INFNoClassDefFoundErrorcatchThrowable

try {
    // Statement(s) that cause(s) the affected class to be loaded
} catch (Throwable t) {
    Logger.getLogger("<logger-name>").info("Loading my class went wrong", t);
}

评论

0赞 Stephen C 1/29/2019
这是不正确的。缺少资源不会出现此错误。只有当缺少一个类时,你才会得到它。
0赞 ᴠɪɴᴄᴇɴᴛ 1/29/2019
@StephenC也许我应该更多地强调这一部分,但我写了.这实际上发生在我身上,我能够通过添加缺少的属性文件来解决。我之所以添加这个答案,正是因为在上述情况下,人们不会预料到会出现这个错误。for example a properties file that the affected class tries to load from the META-INF directoryNoClassDefFoundError
1赞 Stephen C 1/29/2019
那么,您在解释中遗漏了一些非常重要的内容,因为缺少资源文件可能触发该异常的唯一方法是尝试在初始化中加载资源文件......这触发了未经检查的异常并导致类 init 失败。任何从静态初始化传播的未经检查的异常都会这样做。static
0赞 Stephen C 1/29/2019
如果我错了(即这不是由于初始化失败),我会有兴趣看到一个实际的例子(即 MCVE)来演示该行为。static
1赞 ᴠɪɴᴄᴇɴᴛ 1/31/2019
@StephenC 不过,你是绝对正确的:(我查找了遇到此问题的案例,它确实涉及尝试加载资源包的静态初始值设定项。我将补充/纠正我对原因的描述。感谢您指出这一点。
9赞 Bartek Lipinski 12/5/2018 #18

一个有趣的例子是,您可能会看到很多情况,即当您:NoClassDefFoundErrors

  1. throwa 在班级的块中RuntimeExceptionstaticExample
  2. 拦截它(或者如果它无关紧要,就像它被扔在测试用例中一样)
  3. 尝试创建此类的实例Example

static class Example {
    static {
        thisThrowsRuntimeException();
    }
}

static class OuterClazz {

    OuterClazz() {
        try {
            new Example();
        } catch (Throwable ignored) { //simulating catching RuntimeException from static block
            // DO NOT DO THIS IN PRODUCTION CODE, THIS IS JUST AN EXAMPLE in StackOverflow
        }

        new Example(); //this throws NoClassDefFoundError
    }
}

NoClassDefError将伴随着从静态块中抛出。ExceptionInInitializerErrorRuntimeException


当您在 UNIT TESTS 中看到时,这种情况尤其重要。NoClassDefFoundErrors

在某种程度上,您是在测试之间“共享”块执行,但初始值仅在一个测试用例中。第一个使用有问题的类。使用该类的其他测试用例只会抛出 .staticExceptionInInitializerErrorExampleExampleNoClassDefFoundErrors

评论

4赞 DailyFrankPeter 12/7/2018
这在现实生活中是非常有用的建议。我刚刚在类属性初始值设定项上遇到了同样的情况。您只有一次机会在日志中看到实际问题。一旦类被加载(或无论如何都尝试过),你需要重新启动所有内容。
0赞 Steve Stilson 4/4/2019 #19

当我没有在项目的 Java 构建路径的“Order and Export”选项卡上导出类时,我收到了 NoClassDefFound 错误。确保在添加到项目构建路径的任何依赖项的“Order and Export”选项卡中勾选。请参阅 Eclipse 警告:XXXXXXXXXXX.jar将不会导出或发布。可能会产生运行时 ClassNotFoundExceptions

0赞 chancdn 8/6/2019 #20

也可能是因为您从具有特定包名称的 IDE 中复制了代码文件,并且想要尝试使用终端运行它。您必须先从代码中删除包名称。 这发生在我身上。

1赞 Alan Ackart 11/1/2019 #21

当我将另一个模块的 Maven 依赖项添加到我的项目中时,我收到了这个错误,这个问题最终通过添加到我的程序的 JVM 选项(自 JDK5.0 以来默认为 1 兆字节)解决了这个问题。据信该程序没有足够的堆栈来加载类。-Xss2m

1赞 Ben Waters 2/25/2020 #22

就我而言,由于JDK版本不匹配,我收到了此错误。当我尝试从 Intelij 运行应用程序时,它不起作用,但随后从命令行运行它起作用了。这是因为 Intelij 尝试使用已设置的 Java 11 JDK 运行它,但在命令行上,它使用 Java 8 JDK 运行。在 Project SDK > > Project Structure > Project Settings 下切换该设置后,它对我有用。

0赞 bdskfsdk321dsad3 3/1/2020 #23

每个人都在这里谈论一些 Java 配置问题、JVM 问题等,就我而言,错误与这些主题完全无关,并且有一个非常琐碎且易于解决的原因:我在控制器(Spring Boot 应用程序)的端点上有一个错误的注释。

0赞 pixel 5/16/2020 #24

我在使用 Liberty 服务器的 JavaEE 中遇到了一个有趣的 NoClassDefFoundError 问题。我正在使用 IMS 资源适配器,而我的server.xml已经有用于imsudbJXA.rar的资源适配器。 当我为 imsudbXA.rar 添加新的适配器时,我会开始为 DLIException、IMSConnectionSpec 或 SQLInteractionSpec 的实例对象收到此错误。 我不知道为什么,但我通过仅使用imsudbXA.rar为我的工作创建新server.xml来解决它。我确信在server.xml中使用多个资源适配器是可以的,我只是没有时间研究这个问题。

1赞 logbasex 8/15/2020 #25

更新 [https://www.infoq.com/articles/single-file-execution-java11/]:

在 Java SE 11 中,您可以选择启动单个源代码文件 直接,无需中间编译。只是为了您的方便, 这样像你这样的新手就不必运行 javac + java(当然, 让他们感到困惑,为什么会这样)。

0赞 Thomas McSwain 9/30/2020 #26

我遇到了这个错误,但无法根据这个线程找出解决方案,而是自己解决了。

对于我的问题,我正在编译以下代码:

package valentines;

import java.math.BigInteger;
import java.util.ArrayList;

public class StudentSolver {
    public static ArrayList<Boolean> solve(ArrayList<ArrayList<BigInteger>> problems) {
        //DOING WORK HERE
        
    }
    public static void main(String[] args){
        //TESTING SOLVE FUNCTION
    }
    
}

然后,我在类似于 /ProjectName/valentines 的文件夹结构中编译此代码 编译它工作正常,但试图执行:java StudentSolver

我收到NoClassDefError。

为了解决这个问题,我只是删除了:package valentines;

我不是很精通 java 包之类的东西,但这就是我修复错误的方式,如果其他人已经回答了这个问题,那么很抱歉,但我无法将其解释为我的问题。

1赞 priyanka_rao 3/18/2021 #27

我在尝试在 Tomcat/JBOSS 服务器上部署应用程序时收到 NoClassDefFoundError。我使用不同的依赖项来解决问题,但一直收到相同的错误。将所有 javax.* 依赖项标记为 pom.xml 中提供,而 war 实际上没有依赖项。尽管如此,问题还是不断出现。

终于意识到 src/main/webapps/WEB-INF/classes 的 classes 文件夹被复制到我的战争中,所以这个类被复制的不是编译的类,因此没有依赖项更改可以解决问题。

因此,如果复制了任何以前编译的数据,请小心,删除类文件夹并重新编译后,它起作用了..

4赞 yoAlex5 3/26/2021 #28

Java ClassNotFoundException 与 NoClassDefFoundError

[类加载器]

静态与动态类加载

Static(Implicit) class loading- 引用、实例化或继承的结果。

MyClass myClass = new MyClass();

Dynamic(Explicit) class loading是 Class.forName()、loadClass()、findSystemClass() 的结果

MyClass myClass = (MyClass) Class.forName("MyClass").newInstance();

每个类都有一个 which 使用这就是为什么ClassLoaderloadClass(String name);

explicit class loader uses implicit class loader

NoClassDefFoundError是 的一部分。这是为了保证在编译期间呈现了这个类,但现在(在运行时)它不存在了。explicit class loaderError

ClassNotFoundException是 的一部分。它应该在另外可以使用的场景中具有弹性 - 例如反射。implicit class loaderException

0赞 douglas 11/21/2022 #29

我的解决方案是“利用”缺少的特定类的类路径内容。就我而言,我有 2 个依赖项,虽然我能够使用 javac 成功编译......,但我无法使用 java ...运行生成的类文件,因为 BouncyCastle jar 中的 Dynamic 类无法在运行时加载。

javac --classpath "ext/commons-io-2.11.0;ext/bc-fips-1.0.2.3" hello.java

因此,在编译时和运行时,JVM 知道在哪里获取 Apache Commons 和 BouncyCastle 依赖项,但是,在运行它时,我得到了

Error: Unable to initialize main class hello
Caused by: java.lang.NoClassDefFoundError: 
org/bouncycastle/jcajce/provider/BouncyCastleFipsProvider

因此,我根据类路径在同一位置手动创建了一个名为 ext 的新文件夹,然后我放置了 BouncyCastle jar 以确保在运行时可以找到它。您可以将 jar 相对于类文件或 jar 文件放置,只要生成的清单具有指定的 jar 位置即可。注意:我只需要使用一个包含缺少的类文件的 jar。

0赞 Leena 11/9/2023 #30

对我来说,问题是由于在 pom 中添加了不正确的依赖项。要检查这是否是您的问题,请运行,它应该会标记此问题。mvn clean verify