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


118

使用
java -cp CLASSPATH和运行Java应用程序有什么区别java -jar JAR_FILE_PATH?在运行Java应用程序时,其中一个优先于另一个吗?我的意思是这些方法中的哪一种对JVM而言更昂贵(根据其机器资源的使用情况)?

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

Answers:


97

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

我不希望任何一个版本在性能上都有优缺点。只是告诉jvm主线程使用哪个类以及在哪里可以找到库。


线程呢?在尝试运行应用程序时,JVM产生的线程数量是否相同?
Reza 2012年

1
是。这两个版本都将定位main方法,并通过单个线程执行该方法。第一个版本将类名作为参数传递,第二个版本,jvm将在mainfest中找到它。
安德烈亚斯·多克

@Andreas_D请看一下这篇文章,我想我以错误的方式使用了-cp,并且我不纠正我的错误。
fu DL

60

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

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

您可以在此处此处找到有关此内容的更多信息。

PS:-cp-classpath是同义词。


我关心的是资源?他们使用的资源之间有区别吗?
Reza 2012年

@Hesam如果您询问-cp和之间的性能差异-classpath,那么不会,没有差异。
Radu Murzea

1
没有!我的意思是-cp(或-classpath)和-jar之间的性能差异
Reza

2
@Hesam使用-jar您指定要运行的可执行JAR。通过-cp您指定程序可能需要的其他类/库的路径。这两个有不同的目的。
Radu Murzea 2012年

@RaduMurzea,你是什么意思,当我们将它们结合在一起时,它真的不起作用吗?EGjava -jar PATH -cp PATH2
Pacerier

18

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

java -cp com.mycompany.MyMain

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

Main-Class: com.mycompany.MyMain


请看一下这篇文章,我想我以错误的方式使用了-cp,并且我没有如何纠正我的错误。
福DL

10

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

震撼的可执行文件格式:java -jar JarFile如果您希望通过一个简短的命令启动应用程序,则可以使用该格式。您可以使用Class-Path条目中以空格分隔的jar来在清单中指定其他相关的jar文件,例如:

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

两者在性能上可比。


请看一下这篇文章,我想我以错误的方式使用了-cp,并且我没有如何纠正我的错误。
福DL

2

就像已经说过的那样,-cp仅用于告诉命令行中的jvm主线程使用哪个类以及在哪里可以找到库(定义类路径)。在-jar中,它期望在jar文件清单中定义类路径和主类。因此,其他方法是在命令行中定义内容,而其他方法则是在jar清单中找到它们。性能没有差异。您不能同时使用它们,-jar将覆盖-cp。

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


1

在性能方面不会有任何差异。使用java-cp,我们可以在类路径中指定运行Java类文件所需的类和jar。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.