【问题标题】:Can't resolve the error: java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException无法解决错误:java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException
【发布时间】:2022-04-08 20:55:25
【问题描述】:

尝试使用 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 开发一个项目,该项目将接受用户查询、搜索 Google 图片,然后将一些结果下载到我的计算机上。为此,我不得不使用一些第三方库,例如 JSoup、Json-Simple 和 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 shade plugin is not called automatically for goal "package" 我能够弄清楚我的问题,尽管我仍然不完全确定为什么这是一个问题。无论如何,我想我会更新这篇文章,以防其他有类似问题的人偶然发现它。顺便说一句,这是在 Mac OS 上,以防万一。谢谢大家的帮助。

【问题讨论】:

  • 你能在你的 IDE 上运行它吗?这个问题只有在你导出 JAR 时才会出现?
  • 我在 macOS 终端上运行它。我确实安装了 NetBeans,但我没有为此使用它。
  • 所以你只运行生成的JAR?
  • 误会了,是的,我正在运行 Maven 生成的 JAR。我进入目标/类目录并输入命令“java com.mycompany.App”来运行程序。这对于我之前使用 Maven 作为练习制作的更简单的程序来说效果很好。

标签: java json maven


【解决方案1】:

通常NoClassDefFound 错误与运行时缺少库有关。

由于您使用终端运行,因此我假设您正在使用 Maven 构建项目并运行生成的 JAR,

我建议您使用maven-shade-plugin 并生成一个uber-jar,正如我在this question 中解释的那样。

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

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

PS:记得查看与Executable Jars相关的this section

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

【讨论】:

  • 谢谢。我刚刚尝试过,但不幸的是我得到了同样的错误。添加插件后,我做了rm ~/.m2,mvn install,mvn clean,mvn compile,然后运行它生成的JAR。
  • 同时删除 jsoup 依赖的 &lt;scope&gt;provided&lt;/scope&gt; 以强制包含在 JAR 中
  • 不幸的是没有运气
  • 您介意反编译 JAR 并检查是否在其中生成了相应的依赖项吗?
  • 我可以尝试,但老实说,我不确定我将如何去做。如果您有指南,我将非常乐意尝试。
【解决方案2】:

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

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

编辑:更多细节

您必须执行以下操作:

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

考虑放弃“自己动手”的方式。 如果你使用 Spring Boot (我喜欢, 我不为他们工作)。 Spring Boot 的一个特性是重新发明的“Fat Jar”,它将包含一个可交付工件(fat jar)中的依赖项,并在启动时将它们添加到类路径中。

编辑:
Spring boot 可执行 jar 文件不是“Fat Jar”, 相反,它将依赖项包含在 可执行 jar 并在启动时将所述 jar 添加到类路径中。

【讨论】:

  • 如何在运行时编译路径上安装这些?我只修改过 CLASSPATH 环境变量,但我认为 maven 没有必要这样做?
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2015-12-02
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多