Java jar 在运行时找不到类

标签 java intellij-idea jar

我在 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 中编译和运行程序效果很好。

我的项目配置为 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 -> 从具有依赖项的模块 -> 添加主源文件夹和库文件中的所有库,添加 list 和主类并导出 jar 。

几天来我一直在努力解决这个问题,但我不明白为什么它找不到 class

最佳答案

我认为你这边有误解。

您的项目由两个重要部分组成:

  1. 你自己的代码
  2. 您的代码使用的外部库

当您在 IDE 中运行您的项目,并且您的项目设置正确时,两者都在您的类路径中。

但是当您为您的项目创建一个JAR 时,这在很大程度上取决于您的设置。意思是:“默认”是为您的项目创建的 JAR包含“1”。部分。因为您不希望首先将所有外部类添加到“您的”JAR。

因此,要解决这个问题:当您想在命令行上从 JAR 运行程序时,您还需要将所有那些外部 JAR 放在您的类路径中!因为,如前所述:要运行,您需要在类路径中同时出现“1”和“2”部分。

结论:您应该检查 gradle 在它为您创建的 JAR 中放入了什么。我很确定:那个 JAR 只包含“1”。

(郑重声明,这样很好。可以将所有内容打包到一个 jar 中,但这需要您自己动手)

关于Java jar 在运行时找不到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39587781/

相关文章:

java - 如何将JSP页面循环中的值传递到另一个JSP页面?

java - SpringMongo - 发现文档结构

android - 替换 Android 中的主要 Activity 后无法启动应用程序

java - 如何将 intellij 的导入从内联更改为全局?

Java编程编译jar

apache-spark - 从 s3 将外部 jars 加载到 Zeppelin

java - 移动类包时抛出 Serializable class not found CLASSNAME 错误(即使 serialVersionUID 已在类中说明)

java - 哪个更好 ?许多自定义异常类,还是一个异常类包含许多自定义异常代码?

应用程序启动中的JavaFX简单按钮异常?

java - 从几个版本运行几个 jar,但具有相同的名称和相同的类名