在 Intellij 中构建 jar 文件后出现 java.lang.NoClassDefFoundError

标签 java intellij-idea jar noclassdeffounderror

我的第一个应用程序的结构很简单:

libs
  opencsv-3.8.jar
  yamlbeans-1.0.jar
out
  artifacts
    ...
  production
    ...
src
  META-INF
    MANIFEST.MF
  pl.krzysiu
    App.java
    CsvReplacer.java

编译和运行程序期间一切正常。在默认的 out\artifacts 目录中构建工件 jar 文件后,我得到

java.lang.NoClassDefFoundError: net/sourceforge/yamlbeans/YamlException

当我尝试通过 java -jar CsvReplacer.jar 命令运行它时

这些库包含在 jar 文件中(解压后就在那里) - 它们被添加到项目结构中的部分(单独 - 每个文件一个文件) lib),整个libs目录包含在模块部分的依赖项选项卡中(选中导出复选框)和libs dir 类似地添加到 Artifacts 部分的 Output Layout 中。

list 文件包含:

Manifest-Version: 1.0
Class-Path: libs\yamlbeans-1.0.jar libs\opencsv-3.8.jar
Main-Class: pl.krzysiu.App

为什么应用程序看不到这些库?如果我手动将此目录复制到 CsvReplacer.jar 文件的位置 - 一切正常。

CsvReplacer.jar 文件内的结构如下所示:

libs
  opencsv-3.8.jar
  yamlbeans-1.0.jar
META-INF
  MANIFEST.MF
pl
  krzysiu
    App.java
    CsvReplacer.java

IDE:Intellij IDEA 2016.3

最佳答案

标准 Java 类加载器无法找到嵌入另一个 JAR 文件中的 JAR 文件。

制作带有依赖项的可执行 JAR 时,您有两种选择。

  1. 通过将依赖 JAR 的内容合并到主 JAR 中来创建所谓的 uberJAR 文件。

    引用文献:

  2. 为您的 JAR 提供一个“Class-Path” list 属性,以告诉它(外部!)依赖 JAR 的位置。

您不能同时给出 -cp-jar 选项。但另一种选择是去掉 -jar 选项并使用 -cp 参数来指定类路径。

或者,您可以实现一个自定义类加载器,该类加载器可以从 jar 内的 jar 加载,或者使用类似 one-jar 的东西。或Spring Boot .

关于在 Intellij 中构建 jar 文件后出现 java.lang.NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41090329/

相关文章:

java - 当响应不包含 header 信息时如何解析json响应

java - Flutter 访问私有(private)值

java - Android计算2个GPS坐标之间的角度

ubuntu - IntelliJ IDEA 启动后丢失图标

java - 在多个项目中共享JAR的最佳方法是什么?

eclipse - 无法从 Eclipse 部署 JavaFX 2 jar

java - Spring Prototype作用域bean,配置设计模式

java - 如何在IntelliJ IDEA GUI Designer中添加自己的属性编辑器?

scala - 为什么 IDEA 不解析 scala.reflect,但 scala-reflect 包含在项目设置中?

java - 导出带有资源的 JAR,音频无法播放