![](/img/trans.png)
[英]IntelliJ - Maven adding external jar file but java.lang.NoClassDefFoundError
[英]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
在編譯和運行程序期間一切正常。 在默認的 out\\artifacts 目錄中構建工件 jar 文件后,我得到
java.lang.NoClassDefFoundError: net/sourceforge/yamlbeans/YamlException
當我嘗試通過 java -jar CsvReplacer.jar 命令運行它時
這些庫包含在 jar 文件中(解壓縮后就在那里)-它們被添加到項目結構中的庫部分(單獨 - 每個庫一個文件),整個庫目錄包含在模塊部分的依賴項選項卡中(選中導出復選框),並且libs目錄也類似地添加到工件部分的輸出布局中。
清單文件包含:
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 提供一個“類路徑”清單屬性,以告訴它(外部!)依賴 JAR 的位置。
您不能同時提供-cp
和-jar
選項。 但另一種選擇是去掉-jar
選項並使用-cp
參數來指定類路徑。
或者,您可以實現一個自定義類加載器,它可以從 jar 中的 jar 加載,或者使用類似one-jar或Spring Boot 的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.