【问题标题】:Java jar cannot find class on runJava jar 在运行时找不到类
【发布时间】:2017-01-28 00:08:11
【问题描述】:

我在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 -> 从具有依赖项的模块 -> 添加主源文件夹和库文件中的所有库,添加清单和主类并导出罐子。

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

【问题讨论】:

  • 堆栈跟踪表明您的类路径中没有番石榴。您是否尝试在运行时使用 -classpath 选项添加它?
  • 您的程序似乎依赖于这些库,即当您尝试运行程序时,您必须add them to classpath

标签: java intellij-idea jar


【解决方案1】:

我认为你有一个误解。

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

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

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

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

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

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

(为了记录,这样很好。可以将所有内容捆绑到一个 jar 中,但这需要你自己努力)

【讨论】:

  • 是否可以将项目使用的所有 jar 放在单独的文件夹中并在类路径中使用该文件夹?现在我的库 jar 位于主 jar 中。
  • 我不能告诉你什么是正确的 ;-) 你必须弄清楚你希望你的 JAR 是什么样子。我认为您甚至可以在 JAR 的 META 信息中包含对其他 JAR 的“依赖项”。在这种情况下,您只需要类路径中的那个目录;并且您在自己的 JAR 中列出所有必需的 JAR。或者,您必须在类路径中列出所有 JAR 文件名!或者,换句话说:您想阅读 gradle 文档以了解该工具在做什么;以及如何影响它的工作!
  • 你是最好的先生 :) 我已经导出了 jar 目录中的所有 jar 并在类路径中手动添加了所有库,现在 jar 可以正常运行了
  • 非常感谢。很高兴我能帮上忙!
猜你喜欢
  • 2016-05-21
  • 2020-07-28
  • 2016-12-28
  • 2017-05-10
  • 2020-09-24
  • 1970-01-01
  • 2013-06-30
  • 2019-02-21
  • 1970-01-01
相关资源
最近更新 更多