簡體   English   中英

Java jar在運行時找不到類

[英]Java jar cannot find class on run

我已經在IntelliJ ide中創建了一個簡單的Java程序。 我使用了很少的庫,當我嘗試將jar導出為工件並從命令行運行它時,出現以下錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/util/concurrent/FutureCallback
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2615)
        at java.lang.Class.getMethod0(Class.java:2856)
        at java.lang.Class.getMethod(Class.java:1668)
        at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.FutureCallback
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 6 more

IntelliJ編譯和運行程序效果很好。

我的項目使用以下build.gradle配置為gradle項目:

group 'marianpavel.com'
version '1.0'

apply plugin: 'java'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
    maven {
        url "http://repo.bastian-oppermann.de"
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'de.btobastian.javacord:javacord:2.0.11'
    compile 'ch.qos.logback:logback-classic:1.0.13'
    compile 'de.btobastian.sdcf4j:sdcf4j-core:1.0.2'
    compile 'de.btobastian.sdcf4j:sdcf4j-javacord:1.0.2'
    compile 'org.jsoup:jsoup:1.9.2'
}

我已經按如下方式導出了jar:項目結構->工件-> Jar->從具有依賴項的模塊->添加了主源文件夾和庫文件中的所有庫,添加了清單和主類並導出了jar。

我試圖解決這幾天,但我不明白為什么它找不到class

我認為您的觀點存在誤解。

您的項目包含兩個重要部分:

  1. 您自己的代碼
  2. 您的代碼正在使用的外部庫

當您在IDE中運行項目並且項目設置正確時, 這兩件事都在類路徑中。

但是,當您為項目創建JAR時 ,它很大程度上取決於您的設置。 含義:“默認”是為您的項目創建的JAR 包含“ 1”。 部分。 因為您不希望所有外部類都首先添加到“您的” JAR中。

因此,要解決此問題:當您想從命令行上的JAR運行程序時,那么您還需要所有這些外部 JAR都位於類路徑中! 因為,如前所述:要運行,您需要在類路徑中同時包含“ 1”和“ 2”部分。

結論:您應該檢查gradle放入它為您創建的JAR中。 我很確定:JAR僅包含“ 1”。

(為了記錄,這很好。可以將所有內容捆綁到一個jar中,但這需要您的工作)

暫無
暫無

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

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