我有一个用Swing构建的GUI应用程序和一个名为GraphStream的第三方图形库(包括2个JAR)。这可能是一个类路径问题,与库本身无关。
当我从Eclipse运行时,GUI会出现,并且没有错误/警告。
但是,当我尝试从命令行运行时,我要么收到NoClassDefFoundError,要么应用程序在加载库时运行并无限期"挂起"。这似乎完全是偶发的。有时错误会打印出来,有时JVM只是挂起。这就是我运行应用程序的方式:
java -verbose -classpath '../lib;.' -cp . bt_sim <args>
这两个JAR文件在"../lib"目录中(这是该目录中仅有的两个文件)。此外,我写的类在"."中。-当实际引发错误时,这是输出:
... Other loading output from JVM debug ...
[Loaded java.util.IdentityHashMap$KeySet from C:Program FilesJavajre8librt.jar]
java.lang.NoClassDefFoundError: org/graphstream/graph/Graph
at bt_sim.main(bt_sim.java:70)
Caused by: java.lang.ClassNotFoundException: org.graphstream.graph.Graph
at java.net.URLClassLoader$1.run(Unknown Source)
当应用程序挂起时:
...
[Loaded java.util.Formatter$Flags from C:Program FilesJavajre8librt.jar]
[Loaded java.util.Formatter$Conversion from C:Program FilesJavajre8librt.jar]
[Loaded sun.misc.Cleaner from C:Program FilesJavajre8librt.jar]
即使在Linux环境中运行时,也会出现同样的错误。在所有情况下,我都使用JRE 8运行。在Eclipse中,从命令行运行时,只包含两个JAR文件(第三方图形依赖项)。JAR文件在我上面的命令中的"lib"目录中。任何关于调查内容的想法都会非常有帮助!
我的解决方案我没有意识到我必须在类路径中显式地包含每个第三方JAR。完成此操作后,应用程序按预期执行:-/
-classpath
和-cp
是别名:
$ java -help
…
-cp <class search path of directories and zip/jar files>
-classpath <class search path of directories and zip/jar files>
A : separated list of directories, JAR archives,
and ZIP archives to search for class files.
我怀疑一个在一起使用时会覆盖另一个。相反,请使用包含平台所需的lib
目录和路径分隔符的表单。