簡體   English   中英

在 Intellij 中構建 jar 文件后出現 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 時,您有兩種選擇。

  1. 通過將依賴 JAR 的內容合並到主 JAR 中來創建所謂的 uberJAR 文件。

    參考:

  2. 為您的 JAR 提供一個“類路徑”清單屬性,以告訴它(外部!)依賴 JAR 的位置。

您不能同時提供-cp-jar選項。 但另一種選擇是去掉-jar選項並使用-cp參數來指定類路徑。

或者,您可以實現一個自定義類加載器,它可以從 jar 中的 jar 加載,或者使用類似one-jarSpring Boot 的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM