javac、java和jar命令座椅通风
javac、java和jar命令
背景
我是⼀个java程序员,平时运⾏编译,打包和运⾏程序都是由IDE或Maven来完成,应⽤上线部署都是由其他⼈来写Shell或bat启动停⽌脚本,有⼀天让我把⼀个后台应⽤打包jar在Linxu或Window部署运⾏我竟然蒙B了,好半天才想起来javac、java和jar命令。
滴滴事件javac命令
javac命令的作⽤是将java⽂件编译为class⽂件。
⽤法:javac <options> <source files>
options:为命令选项。
source files:为需要编译的java⽂件或所在的⽬录,多个java⽂件或⽬录⽤空格分隔。
常⽤命令选项:
变速器齿轮
-d:指定存放⽣成的class⽂件路径
-s:指定需要编译的java⽂件或所在路径
-encoding:指定java⽂件使⽤的字符编码。⼀般都会指定utf-8编码,否则输出的中⽂是乱码。
-cp:是-classpath的缩写。指定编译依赖的class⽂件所在的classpath路径、jar、zip。多个路径、jar、zip使⽤分号(;)分隔。
java命令
java命令⽤于执⾏class、jar⽂件。
⽤法:
执⾏类:java [-options] class []
执⾏jar:java [-options] -jar jarfile []
options:命令选项。
class:需要执⾏的class⽂件
jarfile:需要执⾏的jar⽂件
<:需要给执⾏的class⽂件main⽅法传递的参数,多个参数使⽤空格分隔。
常⽤命令选项:
-cp:同javac命令的-cp。
-D<;名称>=<;值>:设置系统属性
例如:java -fig.l,my.config.path为系统属性,l为系统属值。在java中通过Property("my.config.path")获取系统属性值。
jar命令
jar命令⽤于将编译好的程序打包成jar⽂件.
⽤法:·jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
常⽤命令选项:
-c 创建新档案
-t 列出档案⽬录
-x 从档案中提取指定的 (或所有) ⽂件
-u 更新现有档案
-v 在标准输出中⽣成详细输出
-f 指定档案⽂件名
-m 包含指定清单⽂件中的清单信息
-n 创建新档案后执⾏ Pack200 规范化
-e 为捆绑到可执⾏ jar ⽂件的独⽴应⽤程序
指定应⽤程序⼊⼝点
-0 仅存储; 不使⽤任何 ZIP 压缩
-P 保留⽂件名中的前导 ‘/’ (绝对路径) 和 “…” (⽗⽬录) 组件
-
M 不创建条⽬的清单⽂件
-i 为指定的 jar ⽂件⽣成索引信息
-C 更改为指定的⽬录并包含以下⽂件福特福克斯价格
如果任何⽂件为⽬录, 则对其进⾏递归处理。
清单⽂件名, 档案⽂件名和⼊⼝点名称的指定顺序
与 ‘m’, ‘f’ 和 ‘e’ 标记的指定顺序相同。
⽰例 1: 将两个类⽂件归档到⼀个名为 classes.jar 的档案中:
jar cvf classes.jar Foo.class Bar.class
⽰例 2: 使⽤现有的清单⽂件 ‘mymanifest’ 并 将 foo/ ⽬录中的所有⽂件归档到 ‘classes.jar’ 中:
jar cvfm classes.jar mymanifest -C foo/ .
jar中的mymanifest清单⽂件
mymanifest是jar的⽂件清单,每个jar中都会有⼀个META-INF/MANIFEST.MF⽂件,这个就是⽂件清单。也可以理解为描述jar的配置⽂件,当我们执⾏⼀个jar时,JVM怎么知道依赖的jar去哪⾥,执⾏⼊⼝类是哪个,这些信息都是通过配置mymanifest来实现的。MANIFEST.MF⽂件还可以添加许多其他的信息,感兴趣的⾃⾏百度。
⽰例1-编译、执⾏⼀个简单的myProject程序
我们有个myProject程序,App为程序的启动类,App类使⽤slf4j+logbak输出User对象的信息。下⾯展⽰⼀下如果使⽤javac命令编译
和java命令运⾏程序。
程序⽬录结构如下图。
其中class-out为存放编译后的class⽂件,libs存放程序依赖的jar。
第⼀步:切换到myProject⽬录下。
第⼆步:使⽤javac编译项⽬
javac -cp ./libs/slf4j-api-1.7.25.jar;./libs/logback-core-1.2.3.jar;./libs/logback-classic-1.2.3.jar -d ./class-out -encoding utf8 ./src/com/zhangxy/*.java ./src/com/ zhangxy/bean/*.java ./src/com/zhangxy/tool/*.java
其中-cp指定程序依赖的jar;-d指定class⽂件的存放⽬录;-encoding指定java⽂件编码。最后指定需要编译的那些⽬录下的那些java类。资源⽂件(如l)在编译完之后需要⼿⼯copy到编译⽬录。
编译成功后⽬录结果:
第三步:使⽤java执⾏App
java -cp ./class-out;./libs/slf4j-api-1.7.25.jar;./libs/logback-core-1.2.3.jar;./libs/logback-classic-1.2.3.jar com.zhangxy.App argA argB
其中-cp指定程序依赖的jar,注意/class-out也需要添加到-cp中,因为执⾏App需要。
如果/libs⽬录下的jar太对,可以使⽤/libs/* 表⽰。
App需要指定完全限定名称(包名+类名), argA 、argB是给App的man⽅法传递的参数。运⾏结果如下:(图中的命令多了个-cp;,没有什么作⽤,请忽略)
gps定位拆除⽰例2-myProject打包为jar
第⼀步编写MAINFEST.FM
Manifest-Version: 1.0
Class-Path: class-out libs/slf4j-api-1.7.25.jar libs/logback-core-1.2.3.jar libs/logback-classic-1.2.3.jar Main-Class: com.zhangxy.App
这⾥需要注意:1,每个冒号后⾯都需要有个空格。2,最后要留⼀个空⾏。
车身校正仪第⼆步:打包jar、执⾏jar
打包jar:
jar cvfm myPrject.jar ./manifest/MANIFEST.MF -C ./class-out/ .
不明⽩最后的点(.)是什么意思,不加上就报语法错误。
执⾏jar
java -jar myPrject.jar
整个过程的运⾏结果如下图。ps:笔误写成了myPrject.jar了。