Answers:
我更喜欢第一个版本来启动Java应用程序,只是因为它的陷阱少了(“欢迎来到classpath hell”)。第二个需要一个可执行的jar文件,并且必须在jar的清单中定义该应用程序的类路径(所有其他类路径声明将被静默忽略...)。因此,在第二个版本中,您必须查看jar,阅读清单,并尝试从jar的存储位置查找类路径条目是否有效...这是可以避免的。
我不希望任何一个版本在性能上都有优缺点。只是告诉jvm主线程使用哪个类以及在哪里可以找到库。
通过该-cp
参数,您可以提供类路径,即程序在编译或运行时可能需要的其他类或库的路径。使用-jar
您指定要运行的可执行JAR文件。
您不能同时指定它们。如果您尝试运行,java -cp folder/myexternallibrary.jar -jar myprogram.jar
那么它将无法真正运行。该JAR的类路径应在其清单中指定,而不应作为-cp
参数指定。
PS:-cp
和-classpath
是同义词。
-cp
和之间的性能差异-classpath
,那么不会,没有差异。
-jar
您指定要运行的可执行JAR。通过-cp
您指定程序可能需要的其他类/库的路径。这两个有不同的目的。
java -jar PATH -cp PATH2
就像已经说过的那样,-cp仅用于告诉命令行中的jvm主线程使用哪个类以及在哪里可以找到库(定义类路径)。在-jar中,它期望在jar文件清单中定义类路径和主类。因此,其他方法是在命令行中定义内容,而其他方法则是在jar清单中找到它们。性能没有差异。您不能同时使用它们,-jar将覆盖-cp。
即使使用-cp,它仍然会检查清单文件。因此,您可以在清单中定义一些类路径,而在命令行中定义一些。当您依赖某个第三方jar时,此功能特别有用,您可能不随其构建一起提供该版本,也不想提供(例如,预计将在要安装它的系统中找到它)。因此,您可以使用它来提供外部罐子。它的位置可能因系统而异,甚至在不同的系统上可能具有不同的版本(但具有相同的接口)。这样,您可以在其他系统上运行该应用程序时,使用其他版本构建该应用程序,并在命令行上将实际的第三方依赖项添加到类路径中。