2016-09-20 53 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运行正常 –

相关问题