我的第一个应用程序的结构很简单:
libs
opencsv-3.8.jar
yamlbeans-1.0.jar
out
artifacts
...
production
...
src
META-INF
MANIFEST.MF
pl.krzysiu
App.java
CsvReplacer.java在编译和运行程序期间,一切都很好。在默认的out\工件目录中构建工件jar文件之后,我得到
java.lang.NoClassDefFoundError: net/sourceforge/yamlbeans/YamlException当我试图通过java -jar CsvReplacer.jar命令运行它时
库包含在jar文件中(在解压缩之后它们在那里)--它们被添加到Project Structure中的Libraries部分(分别--每个库一个文件),整个libs dir包含在Modules部分的Dependencies选项卡中(选中了导出复选框),而libs dir类似地被添加到工件的输出布局中。
清单文件包含:
Manifest-Version: 1.0
Class-Path: libs\yamlbeans-1.0.jar libs\opencsv-3.8.jar
Main-Class: pl.krzysiu.App为什么应用程序看不到libs?如果我手动将这个dir复制到CsvReplacer.jar文件的位置--一切正常。
CsvReplacer.jar文件中的结构如下所示:
libs
opencsv-3.8.jar
yamlbeans-1.0.jar
META-INF
MANIFEST.MF
pl
krzysiu
App.java
CsvReplacer.javaIDE: Intellij 2016.3
发布于 2016-12-12 00:36:15
标准的Java类加载器无法找到嵌入在另一个JAR文件中的JAR文件。
在使用依赖项创建可执行JAR时,您有两个选择。
- [IntelliJ IDEA export Runnable program as Uber Jar](https://stackoverflow.com/q/31387087/139985)
- [https://blog.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/](https://blog.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/)
您不能同时提供一个-cp和一个-jar选项。但是另一种选择是去掉-jar选项并使用-cp参数来指定类路径。
或者,您可以实现一个定制的类加载器,它可以从jar中的jar加载,或者使用类似于一罐或Spring Boot的东西。
https://stackoverflow.com/questions/41090329
复制相似问题