【发布时间】:2012-08-08 23:54:41
【问题描述】:
使用java -cp CLASSPATH 和java -jar JAR_FILE_PATH 运行Java 应用程序有什么区别?在运行 Java 应用程序时,其中一个是否优于另一个?我的意思是哪一种方式对 JVM 来说更昂贵(根据它们的机器资源使用情况)?
哪一个会导致 JVM 在尝试运行应用程序时产生更多线程?
【问题讨论】:
使用java -cp CLASSPATH 和java -jar JAR_FILE_PATH 运行Java 应用程序有什么区别?在运行 Java 应用程序时,其中一个是否优于另一个?我的意思是哪一种方式对 JVM 来说更昂贵(根据它们的机器资源使用情况)?
哪一个会导致 JVM 在尝试运行应用程序时产生更多线程?
【问题讨论】:
我更喜欢第一个版本来启动 java 应用程序,因为它的陷阱更少(“欢迎来到类路径地狱”)。第二个需要一个可执行的 jar 文件,并且该应用程序的类路径必须在 jar 的清单中定义(所有其他类路径声明将被静默忽略......)。因此,对于第二个版本,您必须查看 jar,阅读清单并尝试从 jar 的存储位置找出类路径条目是否有效......这是可以避免的。
我认为这两个版本都没有任何性能优势或劣势。它只是告诉 jvm 哪个类用于主线程以及它可以在哪里找到库。
【讨论】:
【讨论】:
-cp 和-classpath 之间的性能差异,那么不,没有差异。
-jar 指定要运行的可执行 JAR。使用-cp,您可以指定程序可能需要的其他类/库的路径。两者有非常不同的目的。
java -jar PATH -cp PATH2
使用java -cp 时,您需要提供完全限定的主类名称,例如
java -cp com.mycompany.MyMain
使用java -jar myjar.jar时,您的jar文件必须通过包含在文件夹META-INF的jar文件中的manifest.mf提供有关主类的信息:
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 文件中找到需要运行的类。
【讨论】: