【问题标题】:Differences between "java -cp" and "java -jar"?“java -cp”和“java -jar”的区别?
【发布时间】:2012-08-08 23:54:41
【问题描述】:

使用java -cp CLASSPATHjava -jar JAR_FILE_PATH 运行Java 应用程序有什么区别?在运行 Java 应用程序时,其中一个是否优于另一个?我的意思是哪一种方式对 JVM 来说更昂贵(根据它们的机器资源使用情况)?

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

【问题讨论】:

    标签: java jar jvm classpath


    【解决方案1】:

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

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

    【讨论】:

    • 线程呢?在尝试运行应用程序时,它们在 JVM 生成的线程数方面是否相同?
    • 是的。两个版本都将定位 main 方法并使用单个线程执行该方法。第一个版本将类名作为参数传递,使用第二个版本,jvm 会在 mainfest 中找到它。
    • @Andreas_D 请看一下这个post,我想我使用 -cp 的方式有误,我不知道如何纠正我的错误。
    【解决方案2】:

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

    您不能同时指定它们。如果您尝试运行java -cp folder/myexternallibrary.jar -jar myprogram.jar,那么它不会真正起作用。该 JAR 的类路径应在其清单中指定,而不是作为 -cp 参数。

    您可以找到有关此herehere 的更多信息。

    PS:-cp-classpath 是同义词。

    【讨论】:

    • 我关心的是资源?他们使用的资源有区别吗?
    • @Hesam 如果您问的是-cp-classpath 之间的性能差异,那么不,没有差异。
    • 不!我的意思是-cp(或-classpath)和-jar之间的性能差异
    • @Hesam 使用-jar 指定要运行的可执行 JAR。使用-cp,您可以指定程序可能需要的其他类/库的路径。两者有非常不同的目的。
    • @RaduMurzea,你是什么意思当我们结合它们时它不会真的工作?例如。 java -jar PATH -cp PATH2
    【解决方案3】:

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

    java -cp com.mycompany.MyMain

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

    Main-Class: com.mycompany.MyMain

    【讨论】:

    • 请看一下这个post,我想我使用-cp的方式有误,我不知道如何纠正我的错误。
    【解决方案4】:

    如果您希望指定类路径中的所有代码,则需要使用 java -cp CLASSPATH。这对于调试代码很有用。

    如果您希望使用单个短命令启动应用程序,可以使用 jarred 可执行格式:java -jar JarFile。您可以在类路径条目中使用空格分隔的 jar 在 MANIFEST 中指定其他依赖 jar 文件,例如:

    Class-Path: mysql.jar infobus.jar acme/beans.jar
    

    两者在性能方面具有可比性。

    【讨论】:

    • 请看一下这个post,我想我使用-cp的方式有误,我不知道如何纠正我的错误。
    【解决方案5】:

    就像已经说过的那样,-cp 只是用于在命令行中告诉 jvm 哪个类用于主线程以及它可以在哪里找到库(定义类路径)。在 -jar 中,它期望在 jar 文件清单中定义类路径和主类。所以其他的是在命令行中定义东西,而其他的是在 jar 清单中找到它们。性能上没有区别。不能同时使用,-jar 会覆盖 -cp。

    即使你使用 -cp,它仍然会检查清单文件。因此,您可以在清单中定义一些类路径,在命令行中定义一些。当您依赖于某些 3rd 方 jar 时,这特别有用,您可能不会在构建时提供或不想提供(例如,期望它已经在要安装的系统中找到)。所以你可以用它来提供外部罐子。它的位置可能因系统而异,甚至可能在不同系统上具有不同的版本(但具有相同的界面)。这样,您可以使用其他版本构建应用程序,并在不同系统上运行时将实际的 3rd 方依赖项添加到命令行上的类路径。

    【讨论】:

      【解决方案6】:

      在性能方面不会有任何差异。 使用 java - cp 我们可以在类路径中指定运行 java 类文件所需的类和 jar。

      如果是可执行的jar文件。使用 java -jar 命令时,jvm 从 jar 文件中的 /META-INF/MANIFEST.MF 文件中找到需要运行的类。

      【讨论】:

        猜你喜欢
        • 2018-03-23
        • 2014-05-26
        • 2011-01-17
        • 2011-08-10
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        相关资源
        最近更新 更多