140


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

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

4

6 回答 6

110

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

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

于 2012-08-12T13:59:00.693 回答
70

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

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

您可以在此处此处找到更多相关信息。

PS:-cp-classpath都是同义词。

于 2012-08-12T13:56:11.283 回答
22

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

java -cp com.mycompany.MyMain

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

Main-Class: com.mycompany.MyMain

于 2012-08-12T13:57:31.500 回答
10

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

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

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

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

于 2012-08-12T13:57:27.900 回答
2

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

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

于 2017-02-03T07:21:40.933 回答
1

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

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

于 2012-08-12T15:57:52.957 回答