首页 > 编程语言 >java -cp & java jar的区别

java -cp & java jar的区别

时间:2023-06-01 11:34:24浏览次数:54  
标签:java 主类 jar 指定 test cp

java -cp

java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库和jar包,需要全路径到jar包,多个jar包之间连接符:window上分号“;”.Linux下使用“:”。
windows环境:

java -cp .;d:\work\other.jar;d:\work\my.jar packname.mainclassname 


linux环境:

java -cp .:/hone/myuser/work/other.jar:/hone/myuser/work/my.jar packname.mainclassname 

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

java -cp .;c:\work\my.jar;c:\work\*.jar packname.mainclassname 
java -cp .:/home/myuser/work/lib/my.jar:/home/myuser/work/dependency_jars/*.jar packname.mainclassname 

java -jar

java -jar my.jar

执行该命令时,会用到目录META-INF\MANIFEST.MF文件,在该文件中,有一个叫Main-Class的参数,它说明了java -jar命令执行的类。
java -jar方式不可以指定附加依赖jar包。

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

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

用maven导出的包中,如果没有在pom文件中将依赖包打进去,是没有依赖包。
1.打包时指定了主类,可以直接用java -jar xxx.jar。
2.打包是没有指定主类,可以用java -cp xxx.jar 主类名称(绝对路径)。
3.要引用其他的jar包,可以用java -classpath $CLASSPATH:xxxx.jar 主类名称(绝对路径)。其中 -classpath 指定需要引入的类。

下面基于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(清单文件)的内容:
Manifest-Version: 1.0
Main-Class: test.core.Core

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

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.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 -cp .;c:\dir1\lib.jar Test  
  
-cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;”  
  
分隔,linux上是分号“:”分隔。不支持通配符,需要列出所有jar包,用一点“.”代表当前路径。  
虽然现在都有eclipse之类的IDE了,但有时候后会手工编译和运行一些程序,很多人包括多年开发经验的人都不知道怎么在命令行参  
数运行类。有点杯具……  
使用范例:  
java -cp ..\lib\hsqldb.jar org.hsqldb.Server -database mydb   
或   
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb   

标签:java,主类,jar,指定,test,cp
From: https://www.cnblogs.com/kn-zheng/p/17448471.html

相关文章

  • Java中读取用户输入的是谁?Scanner类
    前言我们在初学Java编程的时候,总是感觉很枯燥乏味,想着做点可以交互的小系统,可以让用户自由输入,系统可以接收做出反映。这就要介绍一下Java中的Scanner类了。一、Scanner类Java中的Scanner类是一个用于读取用户输入的工具类。它可以从控制台、文件、字符串等多种来源......
  • 从0到1搭建自己的脚手架(java后端) | 京东云技术团队
    一、脚手架是什么脚手架是一种基础设施工具,用于快速生成项目的框架代码和文件结构。它是一种标准化的开发工具,使开发人员能够在项目的早期阶段快速搭建出一个具备基本功能和结构的系统。二、脚手架的意义主流的微服务架构体系下很多公司会将原有的单体架构或者繁重的微服务进行拆分......
  • java中 & ,&&
    publicclassImoocStudent{publicstaticvoidmain(String[]args)throwsException{if(1>2&&10/0==0)//执行报错,0不能作为分母{System.out.println("******");}if(1>2&10/0==......
  • TCP/IP 协议体系结构模型
    TCP/IP协议体系结构模型OSI模型通过一系列协议描述了理想的网络通信。TCP/IP并不直接对应于此模型。TCP/IP或者将几个OSI层组合为一个层,或者根本不使用某些层。下表显示了OracleSolaris:实现的TCP/IP层。该表列出了从最顶层(应用层)到最底层(物理网络层)的各层。表 1–2TC......
  • 基于RxJava2+Retrofit2精心打造的Android基础框架
    XSnow基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络、上传、下载、缓存、事件总线、权限管理、数据库、图片加载、UI模块,基本都是项目中必用功能,每个模块充分解耦,可自由拓展。XSnow,X:未知一切,取其通用之意;Snow:雪,取其纯净之意。该框架通用纯净,只依赖公共核心库。项目依赖:c......
  • Tcpreplay重放pcap包, tcprewrite编辑pcap文件
    Tcpreplay是一种pcap包的重放工具,它可以将tcpdump和Ethereal/Wireshark等工具捕捉到的网络流量包进行编辑修改和重放.重写Layer2、3、4层数据包,并将流量重新发送至目标网络,这样通过重放网络流量包从而实现复现问题情景以定位bugtcpreplay本身包含了几个辅助工具(tcpprep、tcpr......
  • Java 一个函数返回两个以上的值
    正常函数只有一个返回值,但我们用数组来做为返回值,这样就可以实现一个函数返回多个值以计算时间差函数为例//获取时间间隔publicstaticString[]getTimeInterval(StringstrStartTime,StringstrStopTime){StringarrStr[]=newString[2];try{......
  • java jdk 8 181下载地址 还是华为给的下载靠谱啊
    https://repo.huaweicloud.com/java/jdk/8u181-b13/  ......
  • Java 获取时间间隔
    使用一个函数获取两种格式的时间差一、时间格式  00:12:50二、总秒数 140//获取时间间隔publicstaticString[]getTimeInterval(StringstrStartTime,StringstrStopTime){StringarrStr[]=newString[2];try{DateFormatdf=......
  • jQuery 是javascript的一个库(常用插件、处理器)
    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validationjQuery就是javascript的一个库,把我们常用的一些功能进行了封装,方便我们来调用,提高我们的开发效率。极大地简化了JavaScript编程。Javascipt跟jQuery的区别:Javascript是一门编程语言,我们用......