java -cp 和 java -jar 的区别

一、java -cp

java -cp-classpath 一样,是指定类运行所依赖其他类的路径,通常是类库、jar 包之类,需要全路径到 jar 包,

  • 多个依赖在Window 上用分号";"隔开。
  • linux上是分号“:”分隔。不支持通配符,需要列出所有jar包,用一点“.”代表当前路径

格式:

java -cp .;myClass.jar packname.mainclassname

表达式支持通配符,例如:

java -cp .;c:\classes01\myClass.jar;c:\classes02\*.jar packname.mainclassname

linux:

java -cp analysisparse-1.0-SNAPSHOT.jar  WriteDataToKafka

java -cp analysisparse-1.0-SNAPSHOT.jar com.bigdata.streaming.SparkStreamingParseDriver

二、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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值