2016-09-20 51 views
2

我在IntelliJ ide中創建了一個簡單的Java程序。我用一些庫,當我嘗試將罐子導出爲一個工件,並通過命令行我碰到下面的錯誤運行: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的偉大工程。

我的項目配置爲gradle項目具有以下build.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。

我想弄明白這幾天,我不明白爲什麼它不能找到class

+0

堆棧跟蹤說,你沒有在番石榴類路徑。你有沒有嘗試在運行時用'-classpath'選項添加它? –

+0

你的程序似乎依賴於那些庫,也就是說,當你嘗試時,你必須[將它們添加到classpath](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html)運行你的程序。 –

回答

4

我認爲你的結論存在誤解。

你的項目包括重要的部分:

  1. 你自己的代碼
  2. 外部庫,你的代碼是使用

當您在IDE中運行你的項目,你的項目設置是否正確,然後都是東西都在你的classpath中。

但是,當您爲您的項目創建一個JAR時,它非常依賴於您的設置。含義:「默認」將是一個爲您的項目創建的JAR 只有包含「1」。部分。因爲你不希望所有的外部類首先被添加到「你的」JAR中。

因此,要解決的是:當你想在命令行上你的JAR運行您的程序,那麼你將需要所有這些外部 JAR文件在你的類路徑中!因爲,如上所述:要運行,您需要「1」和「2」部分出現在類路徑中。

結論:您應該檢查它爲您創建的JAR中放入了哪些gradle。我很確定:JAR只包含「1」。

(和備案,這是很好這樣的。有可能一切捆綁到一個JAR,但將需要您投入的工作)

+0

如果我把我的項目在一個單獨的文件夾中使用的所有jar包並在類路徑中使用該文件夾,那麼可以嗎?現在我的圖書館罐子在主罐子裏面。 –

+0

我不能告訴你什麼是正確的;-)你必須弄清楚你想讓你的JAR看起來如何。我想你甚至可以在JAR的META信息中包含「依賴關係」到其他JAR。在這種情況下,你只需要在你的類路徑中使用該目錄;並在您自己的JAR中列出所有必需的JAR。或者,您必須在您的類路徑中列出所有** JAR文件名**!或者換句話說:您想閱讀gradle文檔以確定該工具正在做什麼;以及你如何影響它正在做的事情! – GhostCat

+0

你是最好的先生:)我已經在jar的目錄中導出了所有jar,並且在類路徑中手動添加了所有庫,現在jar運行正常 –

相關問題