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