java -cp CLASSPATH
使用和运行 Java 应用程序有什么区别java -jar JAR_FILE_PATH
?在运行 Java 应用程序时,其中一个是否优于另一个?我的意思是这些方法中的哪一种对 JVM 来说更昂贵(根据它们的机器资源使用情况)?
哪一个会导致 JVM 在尝试运行应用程序时产生更多线程?
我更喜欢第一个版本来启动 java 应用程序,因为它的陷阱更少(“欢迎来到类路径地狱”)。第二个需要一个可执行的 jar 文件,并且该应用程序的类路径必须在 jar 的清单中定义(所有其他类路径声明将被静默忽略......)。因此,对于第二个版本,您必须查看 jar,阅读清单并尝试找出类路径条目是否从 jar 的存储位置有效......这是可以避免的。
我不希望这两个版本有任何性能优势或劣势。它只是告诉 jvm 哪个类用于主线程以及它可以在哪里找到库。
使用时,java -cp
您需要提供完全限定的主类名称,例如
java -cp com.mycompany.MyMain
使用java -jar myjar.jar
jar 文件时,必须通过 manifest.mf 提供有关主类的信息,该文件包含在文件夹中的 jar 文件中META-INF
:
Main-Class: com.mycompany.MyMain
如果您希望在类路径中指定所有代码,则 java -cp CLASSPATH 是必需的。这对于调试代码很有用。
jarred 可执行格式:java -jar JarFile
如果您希望使用单个短命令启动应用程序,可以使用该格式。您可以在类路径条目中使用空格分隔的 jar 在 MANIFEST 中指定其他依赖 jar 文件,例如:
Class-Path: mysql.jar infobus.jar acme/beans.jar
两者在性能方面具有可比性。
就像已经说过的那样,-cp 只是为了在命令行中告诉 jvm 哪个类用于主线程以及它可以在哪里找到库(定义类路径)。在 -jar 中,它期望在 jar 文件清单中定义类路径和主类。所以其他的是在命令行中定义东西,而其他的是在 jar 清单中找到它们。性能上没有区别。您不能同时使用它们,-jar 将覆盖 -cp。
即使您使用 -cp,它仍然会检查清单文件。因此,您可以在清单中定义一些类路径,在命令行中定义一些。当您依赖于某个 3rd 方 jar 时,这特别有用,您可能不会在构建时提供或不想提供(例如,期望它已经在要安装的系统中找到)。所以你可以用它来提供外部罐子。它的位置可能因系统而异,甚至可能在不同系统上具有不同的版本(但具有相同的界面)。这样,您可以使用其他版本构建应用程序,并在不同系统上运行时将实际的 3rd 方依赖项添加到命令行上的类路径。
在性能方面不会有任何差异。使用 java - cp 我们可以在类路径中指定运行 java 类文件所需的类和 jar。
如果是可执行的jar文件。当使用 java -jar 命令时,jvm 从 jar 文件中的 /META-INF/MANIFEST.MF 文件中找到它需要运行的类。