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

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

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

173319 次浏览

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

你不能两个都指定。如果你尝试运行 java -cp folder/myexternallibrary.jar -jar myprogram.jar,那么它将不会真正工作。该 JAR 的类路径应该在其 Manifest 中指定,而不是作为 -cp参数指定。

你可以找到更多关于这个 给你给你的信息。

PS: -cp-classpath是同义词。

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

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

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

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

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

java -cp com.mycompany.MyMain

使用 java -jar myjar.jar时,jar 文件必须通过包含在文件夹 META-INF中的 jar 文件中的 Manif.mf 提供关于 main class 的信息:

Main-Class: com.mycompany.MyMain

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

我不期望任何版本的性能优点或缺点。它只是告诉 jvm 使用哪个类作为主线程,以及在哪里可以找到库。

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

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

如前所述,-cp 只是用来告诉命令行中的 jvm 主线程要使用哪个类,以及在哪里可以找到库(定义类路径)。它期望在 jar 文件清单中定义 class-path 和 main-class。因此,其他方法是在命令行中定义事物,而其他方法是在 jar 清单中查找它们。在性能上没有区别。你不能同时使用它们-jar 会覆盖-cp。

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