“java -cp”和“java -jar”之间的区别?

时间:2012-08-12 13:52:11

标签: java jar jvm classpath

使用java -cp CLASSPATHjava -jar JAR_FILE_PATH运行Java应用程序有什么区别?是否其中一个更喜欢运行Java应用程序?我的意思是JVM中哪一种方式更昂贵(根据他们的机器资源使用情况)?

哪一个会导致JVM在尝试运行应用程序时产生更多线程?

6 个答案:

答案 0 :(得分:80)

我更喜欢第一个版本来启动一个java应用程序,因为它有较少的陷阱(“欢迎来到classpath地狱”)。第二个需要一个可执行的jar文件,并且该应用程序的类路径必须在jar的清单中定义(所有其他类路径声明将被静默忽略...)。因此,对于第二个版本,您必须查看jar,读取清单并尝试查找类路径条目是否有效,从存储jar的位置...这是可以避免的。

我不认为这两个版本都有任何性能优势或劣势。它只是告诉jvm哪个类用于主线程以及它可以在哪里找到库。

答案 1 :(得分:51)

使用-cp参数,您可以提供类路径,即程序在编译或运行时可能需要的其他类或库的路径。使用-jar指定要运行的可执行JAR文件。

您无法同时指定它们。如果您尝试运行java -cp folder/myexternallibrary.jar -jar myprogram.jar,那么它将无法正常运行。该JAR的类路径应在其Manifest中指定,而不是-cp参数。

您可以找到有关此herehere的更多信息。

PS:-cp-classpath是同义词。

答案 2 :(得分:12)

使用java -cp时,您需要提供完全限定的主类名称,例如

java -cp com.mycompany.MyMain

使用java -jar myjar.jar时,您的jar文件必须通过包含在文件夹META-INF中的jar文件中的manifest.mf提供有关主类的信息:

Main-Class: com.mycompany.MyMain

答案 3 :(得分:10)

如果要在类路径中指定所有代码,则必须使用java -cp CLASSPATH。这对于调试代码非常有用。

如果您希望使用一个简短命令启动应用程序,则可以使用jarred可执行格式:java -jar JarFile。您可以在类路径条目中使用空格分隔的jar指定MANIFEST中的其他相关jar文件,例如:

Class-Path: mysql.jar infobus.jar acme/beans.jar

两者在性能方面具有可比性。

答案 4 :(得分:1)

在表现方面没有任何差异。 使用java -cp我们可以在类路径中指定所需的类和jar来运行java类文件。

如果是可执行jar文件。当使用java -jar命令时,jvm会从jar文件中的/META-INF/MANIFEST.MF文件中找到它需要运行的类。

答案 5 :(得分:1)

就像已经说过的那样,-cp只是用于告诉命令行中的jvm哪个类用于主线程以及它可以在哪里找到库(定义类路径)。在-jar中,它期望在jar文件清单中定义class-path和main-class。所以其他的是在命令行中定义事物,而其他人在jar清单中找到它们。性能没有区别。你不能同时使用它们,-jar会覆盖-cp。

虽然即使您使用-cp,它仍会检查清单文件。因此,您可以在清单中定义一些类路径,在命令行中定义一些类路径。当你依赖某个第三方jar时,这是特别有用的,你可能不会提供你的构建或不想提供(希望它已经在系统中找到它所在的那里)例如安装)。所以你可以用它来提供外部罐子。它的位置可能因系统而异,或者甚至可能在不同的系统上具有不同的版本(但具有相同的接口)。这样,您可以使用其他版本构建应用程序,并在不同系统上运行时,在命令行上将实际的第三方依赖项添加到类路径。