我的第一个应用程序的结构很简单:
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文件中(解压后它们就在那里) - 它们被添加到项目结构中的 Libraries 部分(单独 - 每个文件一个文件) lib),整个 libs dir包含在 Modules 部分的 Dependencies 标签中(选中导出复选框)和 libs < / em> dir类似地添加到 Artifacts 部分的输出布局中。
清单文件包含:
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
答案 0 :(得分:1)
Java类加载器找不到嵌入在另一个JAR文件中的JAR文件。
在制作具有依赖项的可执行JAR时,您有两种选择。
通过将依赖JAR的内容合并到主JAR中来创建所谓的uberJAR文件。
参考文献:
给你的JAR一个&#34; Class-Path&#34; manifest属性告诉它(外部!)依赖JAR的位置。
您无法同时提供-cp
和-jar
选项。但另一种方法是删除-jar
选项并使用-cp
参数指定类路径。