Java jar在运行时找不到类

时间:2016-09-20 07:08:34

标签: java intellij-idea jar

我在Java ide中创建了一个简单的IntelliJ程序。我使用了几个库,当我尝试将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 - >来自具有依赖关系的模块 - >添加了主源文件夹和库文件中的所有库,添加了清单和主类并导出了jar。

我试图解决这个问题好几天,我不明白为什么它找不到class

1 个答案:

答案 0 :(得分:4)

我认为你的结果存在误解。

您的项目包含两个重要部分:

  1. 您自己的代码
  2. 您的代码正在使用的外部库
  3. 当您在IDE中运行项目并且项目设置正确时,两个事物都在您的类路径中。

    但是当您为项目创建 JAR 时,它在很大程度上取决于您的设置。含义:"默认"将为您的项目创建的JAR 包含" 1。"部分。因为您不希望所有外部类都被添加到"您的" JAR首先。

    因此,要解决这个问题:当您想在命令行上从JAR运行程序时,您将需要所有外部 JAR也在您的类路径中!因为,正如所说:要跑,你需要" 1"和" 2"部分路径中存在的部分。

    结论:您应该检查gradle在它为您创建的JAR中放置的内容。我很确定:JAR只包含" 1"。

    (为了记录,它很好。可以将所有东西捆绑到一个罐子里,但这需要你的工作)