美文网首页hive
java -cp 和 java -jar 的区别

java -cp 和 java -jar 的区别

作者: 数据小白鼠 | 来源:发表于2018-06-28 14:46 被阅读142次

    java -cp

    java -cp-classpath 一样,是指定类运行所依赖其他类的路径,通常是类库、jar 包之类,需要全路径到 jar 包,多个依赖在Window 上用分号";"隔开。
    格式:
    java -cp .;myClass.jar packname.mainclassname
    表达式支持通配符,例如:
    java -cp .;c:\classes01\myClass.jar;c:\classes02\*.jar packname.mainclassname

    java -jar

    java -jar 执行命令时,会用到目录META-INF\MANIFEST.MF文件,在该文件中,有一个叫Main-Class的参数,他说明了 java -jar 命令执行的类。

    META-INF\MANIFEST.MF的内容

    Manifest-Version: 1.0
    Main-Class: test.core.Core
    

    Maven 打包

    1)用 maven 导出的包中,如果没有在pom文件中将依赖包打进去,没有依赖包。

    1. 打包时指定了主类,可以直接用java -jar xxx.jar
    2. 打包时没有指定主类,可以用java -cp xxx.jar 主类名称(绝对路径)
    3. 要引用其他的 jar 包,可以用java -classpath $CLASSPATH:xxx.jar 主类名称(绝对路径)。其中 -classpath 指定需要引入的类。

    2)pom.xml 的 build 配置:

    <build>
            <!--<finalName>test-1.0-SNAPSHOT</finalName>-->
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                            <mainClass>test.core.Core</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly-->
                    <executions>
                        <execution>
                            <id>make-assemble</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
    </build>
    

    3)下面基于 pomMETA-INF\MANIFEST.MF 两个文件的配置,进行了三种情况的测试

    1. pom 中 build 指定 mainClass,但是 META-INF\MANIFEST.MF 文件中没有指定 Main-Class:test.core.Core
    java -jar test-jar-with-dependencies.jar //执行成功
    java -cp test-jar-with-dependencies.jar  test.core.Core  //执行失败,提示jar中没有主清单属性
    
    1. pom 中 build 没有指定 mainClass,但是 META-INF\MANIFEST.MF文件中指定了 Main-Class:test.core.Core
    java -jar test-jar-with-dependencies.jar //执行失败,提示jar中没有主清单属性
    java -cp test-jar-with-dependencies.jar  test.core.Core  //执行成功
    
    1. pom 中 build 指定 mainClass && META-INF\MANIFEST.MF 文件中添加了 Main-Class:test.core.Core
    java -cp test-jar-with-dependencies.jar  test.core.Core  //执行成功
    java -jar test-jar-with-dependencies.jar  //执行成功
    

    原文:https://blog.csdn.net/sunny05296/article/details/78268464

    相关文章

      网友评论

        本文标题:java -cp 和 java -jar 的区别

        本文链接:https://www.haomeiwen.com/subject/lupgyftx.html