javac
javac:javac 不能递归,因此有包结构的需要列出来,或者写到一个文件中
javac 常见的参数:javac -help
- @<文件名>:从文件读取选项和文件名
- -d <目录>:指定放置生成的类文件的位置
- -encoding <编码>:指定源文件使用的字符编码
- -source <发行版>:提供与指定发行版的源兼容性
- -target <发行版>:生成特定 VM 版本的类文件
- -extdirs lib:指定项目使用到的扩展依赖包所在的目录
注意:javac 在读取 .java 文件时,会读取操作系统上的文件编码,如果 .java 的保存编码与操作系统使用的编码不一致,则需要使用 -encoding 参数进行指定
前置
创建一个 src 目录,然后在 src/ 目录下创建以下三个类:
- org.example.Demo
- org.example.Server
- org.example.Handler
直接在命令行进行指定
1、不指定目标文件夹的位置,直接在 .java 所在的目录下生成相应的 .class 文件
执行命令:javac src/org/example/*.java
2、使用 -d 指定生成 .class 文件的位置,会自动创建相应的包结构
- 在 src 目录下创建 target 文件夹:mkdir target
- 执行命令:javac -d target src/org/example/*.java
通过文件进行编译
1、在与 src 同级的目录下编写配置文件:javacfile
src/org/example/ServerHandler.java
src/org/example/Server.java
src/org/example/Demo.java
2、在 src 目录下,执行 javac 命令:
- javac @javacfile:则会在 .java 文件的同目录下生成 .class 文件
- javac @javacfile -d target:将编译出来的 .class 输出到目标文件夹,会自动生成包路径
执行
java:执行 .class 文件,常用参数如下
- -cp/classpath <目录和 zip/jar 文件的类搜索路径>:用 ;分隔,用于搜索类文件
- -D<名称>=<值>:用于设置系统属性
使用上面最后一次编译的实例,其中 Demo.class 中含有 main 方法,可执行:
执行上述 .class 文件:
- 在 compile 目录下执行:java -cp target org.example.Demo
- 切换到 target 目录,执行:java org.example.Demo
打包
jar 命令:将 .class 文件打成 jar 包,常用参数
- -c:创建 jar 包
- -t:列出 jar 包中的目录
- -v:显示打包过程
- -f:指定打成的 jar 包名
- -C: 更改为指定的目录并包含以下文件
- 如果任何文件为目录,则对其进行递归处理
- 清单文件名,档案文件名和入口点名称的指定顺序
使用方式:jar -cvfm 【命名】 【/META-INF/MANIFEST.MF】 【要打包的文件1】 【要打包的文件2】 …
打普通包
同样使用最后一次的的编译:
1、在 compile 目录下打普通包:jar -cvf demo.jar -C target .
- -C target . 将target目录下的所有文件进行打包
2、在 target 目录下打普通包:jar -cvf demo.jar .
执行普通包:
- 由于普通包没有指定执行入口,因此不能使用 java -jar demo.jar 的方式执行
- 需要将 jar 包加入类路径,然后执行主类,即:java -cp demo.jar org.example.Demo
打包成可执行 jar
MANIFEST.MF 文件文档:官方文档
创建一个 MANIFEST.MF 文件,文件格式:
- key + 冒号 + 空格 + value
- 文件末尾必须以换行符结尾,否则会忽略最后一行的属性
- 使用 Main-Class 指定默认执行入口类 Main-Class: com.example.Demo
- 使用 Class-Path 指定依赖包路径 Class-Path: ../lib
- 支持指定多个值,其中以空格分隔
1、创建 MANIFEST.MF 文件:
Main-Class: org.example.Demo
注意:换行符不能省略,即结尾必须有一空行,否则无法正确导入
2、执行:jar -cvfm demo.jar MANIFEST.MF -C target .