我更喜欢第一个版本来启动一个 Java 应用程序,因为它缺陷更少(“欢迎来到类路径地狱”)。第二个需要一个可执行的 jar 文件,并且该应用程序的类路径必须在 jar 的清单中定义(所有其他类路径声明将被静默地忽略...)。因此,在第二个版本中,您必须查看 jar,读取清单,并尝试查明类路径条目是否在 jar 存储的位置有效... ... 这是可以避免的。
如前所述,-cp 只是用来告诉命令行中的 jvm 主线程要使用哪个类,以及在哪里可以找到库(定义类路径)。它期望在 jar 文件清单中定义 class-path 和 main-class。因此,其他方法是在命令行中定义事物,而其他方法是在 jar 清单中查找它们。在性能上没有区别。你不能同时使用它们-jar 会覆盖-cp。
即使使用 -cp,它仍然会检查清单文件。因此,您可以在清单中定义一些类路径,在命令行中定义一些类路径。当您依赖于某个第三方 jar 时,这一点特别有用,您可能不会在构建中提供这个第三方 jar,或者不想提供这个第三方 jar (例如,希望在要安装它的系统中已经找到它)。因此,您可以使用它来提供外部罐子。它的位置可能因系统而异,甚至可能在不同的系统上有不同的版本(但具有相同的接口)。通过这种方式,您可以使用其他版本构建应用程序,并在不同系统上运行该应用程序时,将实际的第三方依赖项添加到命令行上的 class-path。