java.lang.NoClassDefFoundError 在 Intellij 中构建 jar 文件之后
java.lang.NoClassDefFoundError after building jar file in Intellij
我的第一个应用程序的结构很简单:
libs
opencsv-3.8.jar
yamlbeans-1.0.jar
out
artifacts
...
production
...
src
META-INF
MANIFEST.MF
pl.krzysiu
App.java
CsvReplacer.java
编译和 运行ning 程序期间一切正常。在默认 out\artifacts 目录中构建工件 jar 文件后,我得到
java.lang.NoClassDefFoundError: net/sourceforge/yamlbeans/YamlException
当我尝试通过 java -jar CsvReplacer.jar 命令 运行 它时
这些库包含在 jar 文件中(它们在解压后就在那里)- 它们被添加到 项目结构 中的 库 部分](单独 - 每个库一个文件),整个 libs 目录包含在 Modules[=] 的 Dependencies 选项卡中39=] 部分(选中导出复选框)并且 libs 目录被添加到 Artifacts[=39= 的 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 类加载器无法找到嵌入到另一个 JAR 文件中的 JAR 文件。
制作带有依赖项的可执行 JAR 时,您有两种选择。
通过将依赖 JAR 的内容合并到主 JAR 中来创建所谓的 uberJAR 文件。
参考文献:
给你的 JAR 一个 "Class-Path" 清单属性来告诉它(外部!)依赖 JAR 的位置。
您不能同时给出 -cp
和 -jar
选项。但另一种选择是摆脱 -jar
选项并使用 -cp
参数来指定类路径。
或者,您可以实现一个自定义类加载器,它可以从一个 jar 加载到一个 jar 中,或者使用类似 one-jar or Spring Boot.
的东西
我的第一个应用程序的结构很简单:
libs
opencsv-3.8.jar
yamlbeans-1.0.jar
out
artifacts
...
production
...
src
META-INF
MANIFEST.MF
pl.krzysiu
App.java
CsvReplacer.java
编译和 运行ning 程序期间一切正常。在默认 out\artifacts 目录中构建工件 jar 文件后,我得到
java.lang.NoClassDefFoundError: net/sourceforge/yamlbeans/YamlException
当我尝试通过 java -jar CsvReplacer.jar 命令 运行 它时
这些库包含在 jar 文件中(它们在解压后就在那里)- 它们被添加到 项目结构 中的 库 部分](单独 - 每个库一个文件),整个 libs 目录包含在 Modules[=] 的 Dependencies 选项卡中39=] 部分(选中导出复选框)并且 libs 目录被添加到 Artifacts[=39= 的 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 类加载器无法找到嵌入到另一个 JAR 文件中的 JAR 文件。
制作带有依赖项的可执行 JAR 时,您有两种选择。
通过将依赖 JAR 的内容合并到主 JAR 中来创建所谓的 uberJAR 文件。
参考文献:
给你的 JAR 一个 "Class-Path" 清单属性来告诉它(外部!)依赖 JAR 的位置。
您不能同时给出 -cp
和 -jar
选项。但另一种选择是摆脱 -jar
选项并使用 -cp
参数来指定类路径。
或者,您可以实现一个自定义类加载器,它可以从一个 jar 加载到一个 jar 中,或者使用类似 one-jar or Spring Boot.
的东西