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

image.png

直接在命令行进行指定

1、不指定目标文件夹的位置,直接在 .java 所在的目录下生成相应的 .class 文件
执行命令:javac src/org/example/*.java
image.png

2、使用 -d 指定生成 .class 文件的位置,会自动创建相应的包结构

  • 在 src 目录下创建 target 文件夹:mkdir target
  • 执行命令:javac -d target src/org/example/*.java

image.png

通过文件进行编译

1、在与 src 同级的目录下编写配置文件:javacfile

  1. src/org/example/ServerHandler.java
  2. src/org/example/Server.java
  3. src/org/example/Demo.java

2、在 src 目录下,执行 javac 命令:

  • javac @javacfile:则会在 .java 文件的同目录下生成 .class 文件

image.png

  • javac @javacfile -d target:将编译出来的 .class 输出到目标文件夹,会自动生成包路径

image.png

执行

java:执行 .class 文件,常用参数如下

  • -cp/classpath <目录和 zip/jar 文件的类搜索路径>:用 ;分隔,用于搜索类文件
  • -D<名称>=<值>:用于设置系统属性

使用上面最后一次编译的实例,其中 Demo.class 中含有 main 方法,可执行:
image.png
执行上述 .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】 …

打普通包

同样使用最后一次的的编译:
image.png

1、在 compile 目录下打普通包:jar -cvf demo.jar -C target .

  • -C target . 将target目录下的所有文件进行打包

image.png

2、在 target 目录下打普通包:jar -cvf demo.jar .
image.png

执行普通包:

  • 由于普通包没有指定执行入口,因此不能使用 java -jar demo.jar 的方式执行
  • 需要将 jar 包加入类路径,然后执行主类,即:java -cp demo.jar org.example.Demo

image.png

打包成可执行 jar

MANIFEST.MF 文件文档:官方文档

创建一个 MANIFEST.MF 文件,文件格式:

  • key + 冒号 + 空格 + value
  • 文件末尾必须以换行符结尾,否则会忽略最后一行的属性
  • 使用 Main-Class 指定默认执行入口类 Main-Class: com.example.Demo
  • 使用 Class-Path 指定依赖包路径 Class-Path: ../lib
  • 支持指定多个值,其中以空格分隔

1、创建 MANIFEST.MF 文件:

  1. Main-Class: org.example.Demo

注意:换行符不能省略,即结尾必须有一空行,否则无法正确导入

2、执行:jar -cvfm demo.jar MANIFEST.MF -C target .
image.png