首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Intellij中构建jar文件后的java.lang.NoClassDefFoundError

在Intellij中构建jar文件后的java.lang.NoClassDefFoundError
EN

Stack Overflow用户
提问于 2016-12-11 19:39:53
回答 1查看 6.4K关注 0票数 2

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

代码语言:javascript
复制
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文件之后,我得到

代码语言:javascript
复制
java.lang.NoClassDefFoundError: net/sourceforge/yamlbeans/YamlException

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

库包含在jar文件中(在解压缩之后它们在那里)--它们被添加到Project Structure中的Libraries部分(分别--每个库一个文件),整个libs dir包含在Modules部分的Dependencies选项卡中(选中了导出复选框),而libs dir类似地被添加到工件的输出布局中。

清单文件包含:

代码语言:javascript
复制
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文件中的结构如下所示:

代码语言:javascript
复制
libs
  opencsv-3.8.jar
  yamlbeans-1.0.jar
META-INF
  MANIFEST.MF
pl
  krzysiu
    App.java
    CsvReplacer.java

IDE: Intellij 2016.3

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-12 00:36:15

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

在使用依赖项创建可执行JAR时,您有两个选择。

  1. 通过将依赖的JAR的内容合并到主uberJAR中,创建一个所谓的JAR.References文件:
代码语言:javascript
复制
- [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/)

  1. 给您的JAR一个“类路径”清单属性,以告诉它(外部!)相依的罐子被找到了。

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

或者,您可以实现一个定制的类加载器,它可以从jar中的jar加载,或者使用类似于一罐Spring Boot的东西。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41090329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档