无法解决错误:java.lang.NoClassDefFoundError:org/json/simple/parser/ParseException



试图使用Maven来组织我的项目,我一直遇到以下错误。我知道这个错误意味着文件在编译时存在,但由于某种原因,在运行时找不到它。

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException

因此,我正在用Java进行一个项目,该项目将接受用户查询,搜索谷歌图像,然后将一些结果下载到我的计算机上。为此,我不得不使用一些第三方库,如JSoup、JsonSimple和Gson。

我最初手动将Jsoup添加到我的类路径中,它很有效,但后来我听说了Maven,并开始使用它。我的问题是,当我试图运行我的代码时,我会收到上面的错误。

我只是不知道如何解决这个问题。我看到了很多关于类似错误的其他帖子,我试图相应地修改我的pom.xml,但我就是不能让它工作。我试着删除了~/.m2文件,运行了mvn-clean、mvn-install、mvn-package、mvn-compile,一切都很好。但到了跑步的时候,我总是会犯这个错误。

以下是我的大部分pom.xml文件。

<repositories>
<repository>
<id>central</id>
<name>Maven repository</name>
<url>http://repo1.maven.org/maven2</url>
</repository>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>

发现的解决方案:所以我省略了pom.xml文件的一些部分,以便于阅读,因为所有其他部分都是由Maven自己生成的,所以我认为那里不可能有任何问题。但它添加了一个名为"pluginManagement"的标签,其中包含了所有其他插件,显然这不允许Shade插件运行。

在ngueno的指导和这个后Maven阴影插件之间,并不是自动为目标调用的;包装";我能够弄清楚我的问题,尽管我仍然不完全确定为什么这是一个问题。无论如何,我想我会更新这篇文章,以防其他有类似问题的人偶然发现它。这是在Mac OS btw上发布的,以防它产生影响。谢谢大家的帮助。

通常NoClassDefFound错误与运行时丢失的库有关。

由于您是使用终端运行的,我认为您是使用Maven构建项目,并运行生成的JAR,

我建议您使用maven-shade-plugin并生成一个uber jar,正如我在这个问题上解释的那样。

生成uber jar的目的是在其中携带所有需要的依赖项(在应用程序类路径上可用)。

实现插件并尝试使用新的JAR运行。

PS:记得查看与可执行Jars相关的部分

更新:删除jsoup依赖项的<scope>provided</scope>,以强制Maven将其与应用程序一起打包,您所说的范围是JDK将在运行时提供此依赖项。

您在依赖项中标识的jar必须存在于运行时类路径中。这不是编译代码时可用的类路径;它是运行应用程序的主机上的类路径。

您必须在目标主机上安装这些jar。

编辑:更多详细信息

您必须执行以下操作:

  1. 识别运行时主机
  2. 在运行时主机上创建一个目录,将相关的jar文件安装到该目录中
  3. 在类路径中包括每个jar

考虑放弃";滚你自己的";路径如果使用Spring Boot(我喜欢它,我不为他们工作)。弹簧靴的一个特点是重新设计的";胖罐子";这将包括一个可交付工件(fatjar)中的依赖项,并在启动时将它们添加到类路径中。

编辑:
Spring引导可执行jar文件不是一个"Fat Jar";,相反,它在可执行jar,并在启动时将所述jar添加到类路径中。

最新更新