菜鸟科技网

JAR命令如何打包与运行Java程序?

什么是 JAR 文件?

JAR(Java Archive)文件是一种 ZIP 格式的压缩包,专门用于 Java 平台,它主要用于:

JAR命令如何打包与运行Java程序?-图1
(图片来源网络,侵删)
  • 打包类文件:将编译后的 .class 文件、相关的资源文件(如 .properties, .xml, 图片等)打包成一个文件,便于分发和管理。
  • 创建可执行程序:通过在 META-INF/MANIFEST.MF 文件中指定主类,可以使 JAR 文件像可执行文件一样直接运行(java -jar myapp.jar)。
  • 作为库:将多个类和资源打包成一个库文件(如 mylib.jar),供其他 Java 项目引用。
  • 打包 Java 应用程序:这是最常见的用法,特别是对于桌面应用和微服务。

jar 命令的基本语法

jar 命令的基本语法如下:

jar [options] [jar-file] [manifest] [entry-point] [-C dir] files...
  • options:命令的选项,-c (创建)、-t (列出内容)、-x (解压) 等。
  • jar-file:要创建或操作的 JAR 文件名。
  • manifest:指定清单文件(MANIFEST.MF)的路径。
  • entry-point:指定应用程序的入口点(主类)。
  • -C dir:在处理文件之前,先切换到指定的目录 dir,这对于将特定目录下的文件打包非常有用。
  • files...:要打包到 JAR 文件中的文件或目录列表。

常用选项详解

下面是 jar 命令最核心和最常用的选项:

选项 长格式 描述
-c --create 创建一个新的 JAR 文件。
-t --list 列出 JAR 文件中的内容(目录和文件)。
-x --extract 从 JAR 文件中解压指定的文件(或所有文件)。
-u --update 更新一个已存在的 JAR 文件(添加或修改文件)。
-v --verbose 在标准输出中显示详细的输出信息(正在处理的文件名)。
-f --file 指定 JAR 文件的名称。通常与 -c, -u, -x, -t 一起使用
-i --index 为指定的 JAR 文件生成索引文件(META-INF/INDEX.LIST)。
-e --main-class 为可执行的 JAR 文件指定主类(入口点)。
-m --manifest 包含指定的清单文件(MANIFEST.MF)到 JAR 文件中。
-M --no-manifest 在创建 JAR 文件时不自动生成 META-INF/MANIFEST.MF 文件。
-C 切转到指定的目录,并处理接下来的文件。
-0 --no-compress 仅存储文件,不进行压缩(与 ZIP 的 -0 选项相同)。

常用命令示例

假设我们有一个简单的 Java 项目结构:

my-project/
├── src/
│   └── com/
│       └── example/
│           └── Main.java
└── lib/

示例 1:创建一个简单的 JAR 文件(仅打包 class 文件)

  1. 编译代码

    JAR命令如何打包与运行Java程序?-图2
    (图片来源网络,侵删)
    # 在 my-project 目录下执行
    javac -d . src/com/example/Main.java

    执行后,会生成一个 com/example/Main.class 文件。

  2. 创建 JAR

    # 创建一个名为 app.jar 的文件,并将 com 目录下的所有内容打包进去
    jar -cvf app.jar com/
    • -c: 创建
    • -v: 显示详细信息
    • -f: 指定输出文件名为 app.jar

示例 2:创建一个包含资源文件的可执行 JAR 文件

这是最常见的需求,我们需要一个 MANIFEST.MF 文件来指定主类。

  1. 创建清单文件 manifest.txt: 在 my-project 目录下创建一个 manifest.txt 文件,内容如下:

    JAR命令如何打包与运行Java程序?-图3
    (图片来源网络,侵删)
    Main-Class: com.example.Main

    注意Main-Class 的值是类的全限定名,并且行尾不能有空格,且文件末尾必须有一个空行。

  2. 编译代码并创建 JAR

    # 假设代码已编译,或者先执行 javac -d . src/com/example/Main.java
    # 创建可执行 JAR
    jar -cvfm app.jar manifest.txt com/
    • -c: 创建
    • -v: 显示详细信息
    • -f: 指定输出文件 app.jar
    • -m: 包含 manifest.txt 文件作为清单
  3. 运行 JAR 文件

    java -jar app.jar

示例 3:创建一个包含源代码和文档的 JAR 文件(分发库)

有时候我们希望将源代码(.java)和 Javadoc 文档一起打包。

  1. 生成 Javadoc

    javadoc -d docs src/com/example/Main.java

    这会在 my-project 下创建一个 docs 目录。

  2. 打包源代码和文档

    # 创建一个包含源码、class文件和文档的 JAR
    jar -cvf mylib-sources.jar com/ docs/

示例 4:查看 JAR 文件内容

# 列出 app.jar 的内容
jar -tf app.jar
# 更详细地列出内容(类似于 ls -l)
jar -tvf app.jar

示例 5:从 JAR 文件中解压文件

# 解压 app.jar 中的所有文件到当前目录
jar -xvf app.jar
# 只解压特定的文件或目录
jar -xvf app.jar com/example/Main.class

示例 6:更新一个 JAR 文件

假设我们修改了 Main.class 文件,并想更新到 app.jar 中。

# 假设 com/example/Main.class 是最新的
jar -uvf app.jar com/

高级用法:模块化 JAR (Java 9+)

从 Java 9 开始,JAR 文件支持模块化(Project Jigsaw),创建模块化 JAR 需要额外的 --module-info 选项。

假设我们有一个 module-info.java 文件:

module com.example.app {
    requires java.desktop; // 需要 Java AWT/Swing
    exports com.example.app; // 导出这个包
}

创建模块化 JAR:

jar --create --file myapp.jar --main-class com.example.Main --module-info module-info.java -C . .

与构建工具(Maven/Gradle)的关系

虽然 jar 命令非常强大,但在现代 Java 开发中,我们通常不直接使用它,而是使用构建工具来自动化这个过程:

  • Maven: 通过 mvn package 命令,Maven 会自动编译代码、运行测试、打包(包括处理依赖和生成清单),最终生成 target/your-app-1.0-SNAPSHOT.jar
  • Gradle: 通过 gradle buildgradle jar 命令,Gradle 也会完成类似的自动化流程,生成 build/libs/your-app-1.0.jar

这些工具简化了构建过程,并处理了依赖管理、插件集成等复杂问题,理解 jar 命令的原理对于排查问题、手动打包或理解构建工具的输出至关重要。

任务 命令
创建 JAR jar -cvf my.jar files_to_add
创建带清单的可执行 JAR jar -cvfm my.jar manifest.txt files_to_add
列出 JAR 内容 jar -tf my.jar
解压 JAR jar -xvf my.jar
更新 JAR jar -uvf my.jar new_files_to_add
运行可执行 JAR java -jar my.jar

掌握 jar 命令是每个 Java 开发者的基本功,它能帮助你深入理解 Java 应用程序的打包和运行机制。

分享:
扫描分享到社交APP
上一篇
下一篇