java -jar 和 java -cp的区别

java | 2020-02-29 19:31:25

java -jar大家都熟悉,运行jar包,使用spring boot打包的jar也需要 java -jar来运行项目,java -cp可能比较少用,那么他们之间有什么区别?

java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类。

1.java -jar执行jar 

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

java -jar 的方式必须要在 pom.xml 文件中指定主类,不可以指定一个主类,然后运行的时候在jar包后面继续指定主类。

2.java -cp执行jar

java -cp .;myClass.jar packname.mainclassname
表达式支持通配符,例如:
java -cp .;c:\classes01\myClass.jar;c:\classes02*.jar packname.mainclassname

java -cp 的方式不需要在 pom.xml 文件中指定主类,主类是否指定看自己需要,然后运行的时候在jar包后面继续指定主类。

3.测试pom设置主类

下面基于pom和META-INF\MANIFEST.MF两个文件的配置,进行了三种情况的测试:
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>

解压打包后的包,展开查看META-INF/MANIFEST.MF 的文件

META-INF\MANIFEST.MF(清单文件)的内容:
Manifest-Version: 1.0
Main-Class: test.core.Core

3.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中没有主清单属性

3.2.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 //执行成功

3.3.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 //执行成功

总结:其实就是一句话,java -jar 和 java -cp 两种方式,如果动态传入执行类,就用-cp,固定执行类就用-jar。

登录后即可回复 登录 | 注册
    
关注编程学问公众号