本文示例基于 Java 8 。
1、实战示例
1.1、入门示例
在当前目录下创建文件 HelloWorld.java ,内容如下:
此时是无法执行的:
需要先编译,然后去执行 class 文件:
将class文件打包到 jar:
此时当前目录会出现 hello.jar:
查看 hello.jar 中文件:
执行 hello.jar 中的 HelloWorld 类:
由于没有在 jar 中指定主类,若直接用-jar
执行 hello.jar 会报错:
manifest.txt 内容(注意,最后一行后面一定要有回车换行):
更新 META-INF/MANIFEST.MF :
换一种方式打包:
再换一种方式打包:
1.2、示例:多个类的打包和执行
当前目录下文件结构:
Util.java 内容:
HelloWorld.java 内容如下:
打包方式1
编译 java 代码:
注意,如果是src作为路径,会报错:
如果只编译 com/example/HelloWorld.java
,com/example/Util.java
也会被自动编译。因为 HelloWorld 依赖 Util 。
查看编译结果:
打jar包方式1:
打jar包方式2:
打包方式2
将编译结果放在一个单独的目录:
1.3、示例:多个类、清单文件、资源文件的打包和执行
目录结构:
方式1
resource 目录中的 META-INF/MANIFEST.MF 没有被打包进去。
方式2
通过 m 选项指定 ./resource/META-INF/MANIFEST.MF
,将 MANIFEST.MF 放了进去。
方式3
将 manifest.txt 的内容复制到了 jar 包的 META-INF/MANIFEST.MF 中。
方式4
参数M表示不自动生成 META-INF/MANIFEST.MF
。所以将resource 中的 META-INF/MANIFEST.MF 打包进来。
1.4、示例:依赖第三方库的打包和执行
以 guava 为例,在 https://github.com/google/guava/releases 下载 jar。
目录结构:
错误的编译方式:
应该用 -cp 指定依赖的jar:
打包:
执行:
2、命令详解: jar 命令
jar 参数
参数 f 对应 jar 文件名,m 对应 manifest 文件名,e对应入口类的全路径名(例如Hello、com.example.Hello)。文件名顺序一定要和m、f、e参数顺序一致。 下面两个是等价的。
ctxui
这几个参数不能同时出现。
更新 manifest
示例:
manifest.txt 文件内容:
manifest.txt 文件名换成其他名字也可以的。
更新操作:
注意,Main-Class 没有被补充进去。这是因为 manifest.txt 最后一行没有回车。
查看jar中文件列表
示例:
将指定目录中的 class 文件放入 jar 中
示例:
将 output 中文件放入 jar 中:
将 manifest 和 class 一起打包
示例:
-C 参数
例如:
表示临时切换到 output 目录,再执行不带 -C 参数的 jar 命令。output
后面的.
代表相对 output 的当前目录。
同时打包 class 、资源文件
示例:
3、命令详解:javac 命令
编译指定目录下的所有 java 文件
比如目录是src,使用 javac -sourcepath src **/*.java
即可。 示例:
一次编译多个文件
示例:
编译结果放到指定目录
4、命令详解释:java 命令
-cp 参数
-cp
全称-classpath
,代表 目录和 zip/jar 文件的类搜索路径。 多个路径使用分隔符连接,Windows使用分号;
,Linux下使用冒号:
。 使用通配符时,不能添加.jar扩展名。
示例:
jar 与 class 混合
下面的示例中 HelloGuava 没有打包到 jar 中。
5、其他
查看 jar 中某个文件的内容
例如查看 test.jar 中 META-INF/MANIFEST.MF
文件内容。
解压 jar 到指定目录
示例: