"java -cp"和"java -jar"之间的区别?

Rez*_*eza 104 java jvm jar classpath

使用
java -cp CLASSPATH和运行Java应用程序有什么区别java -jar JAR_FILE_PATH?是否其中一个更喜欢运行Java应用程序?我的意思是JVM中哪一种方式更昂贵(根据他们的机器资源使用情况)?

哪一个会导致JVM在尝试运行应用程序时产生更多线程?

And*_*s_D 84

我更喜欢第一个版本来启动一个java应用程序,因为它有较少的陷阱("欢迎来到classpath地狱").第二个需要一个可执行的jar文件,并且必须在jar的清单中定义该应用程序的类路径(所有其他类路径声明将被静默忽略...).因此,对于第二个版本,您必须查看jar,读取清单并尝试查找类路径条目是否有效存储jar的位置......这是可以避免的.

我不认为这两个版本都有任何性能优势或劣势.它只是告诉jvm哪个类用于主线程以及它可以在哪里找到库.


Rad*_*zea 52

使用-cp参数,您可以提供类路径,即程序在编译或运行时可能需要的其他类或库的路径.随-jar您指定要运行的可执行JAR文件.

您不能同时指定它们.如果你试图运行java -cp folder/myexternallibrary.jar -jar myprogram.jar那么它将无法正常工作.该JAR的类路径应在其Manifest中指定,而不是作为-cp参数指定.

你可以在这里这里找到更多相关信息.

PS:-cp-classpath是同义词.

  • -1 for -cp和-classpath是同义词. (5认同)
  • @Hesam使用`-jar`指定要运行的可执行JAR.使用`-cp`,您可以指定程序可能需要的其他类/库的路径.2有不同的目的. (2认同)

Ale*_*exR 15

使用时,java -cp您需要提供完全合格的主类名称,例如

java -cp com.mycompany.MyMain

使用java -jar myjar.jarjar文件时,必须通过包含在文件夹中jar文件中的manifest.mf提供有关主类的信息META-INF:

Main-Class: com.mycompany.MyMain


Rei*_*eus 10

如果要在类路径中指定所有代码,则必须使用java -cp CLASSPATH.这对于调试代码很有用.

java -jar JarFile如果您希望使用一个简短的命令启动应用程序,则可以使用jarred可执行格式:您可以使用Class-Path条目中的空格分隔jar在MANIFEST中指定其他相关jar文件,例如:

Class-Path: mysql.jar infobus.jar acme/beans.jar
Run Code Online (Sandbox Code Playgroud)

两者在性能方面都具有可比性.