【问题标题】:java.lang.NoClassDefFoundError after building jar file in Intellij在 Intellij 中构建 jar 文件后的 java.lang.NoClassDefFoundError
【发布时间】:2016-12-11 19:39:53
【问题描述】:

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

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 文件中(解压后就在其中) - 它们被添加到 Project Structure 中的 Libraries 部分(单独 - 每个文件一个文件lib),整个 libs 目录包含在 Modules 部分的 Dependencies 选项卡中(选中导出复选框)和 libs dir 类似地添加到 Artifacts 部分的 Output Layout 中。

清单文件包含:

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 intellij-idea jar noclassdeffounderror


    【解决方案1】:

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

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

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

      参考文献:

    2. 给你的 JAR 一个“Class-Path”清单属性,告诉它(外部!)依赖 JAR 的位置。

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 2013-07-15
      • 2021-01-15
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2016-01-07
      相关资源
      最近更新 更多