正在加载...

Java 中的 JAR

把编译好的类文件打进 jar,就能用一个文件分发和运行。在 Pack.java 里保留 public 类 Pack,在 main 中打印 packed,用 javac Pack.java 编译,再用 jar --create --file Pack.jar Pack.class 创建 Pack.jar。用 java -cp Pack.jar Pack 运行,屏幕会显示 packed。第二个演示打印 shipped,并使用声明了 Main-Class 的 jar,这样 java -jar Pack.jar 才能工作。本课讲的是 jar 打包,不是 JUnit 的 @Test 检查,也不是 Records 的 accessor 打印。

一个 jar,用 -cp 运行

打开 Pack.java。public 类名保持 Pack。如果还有残留的 SumCheck JUnit 断言、Card Records 演示、Pipe Streams 流水线或 Cue lambda 遍历盖住了 jar 主题,就删掉它们。教学文件是你去打包的小 main 程序,不是带 assertEquals 的测试类。
在 Pack.main 里打印一个词:
System.out.println("packed");
先编译:
javac Pack.java
花括号配对正确时,javac 保持安静并写出 Pack.class。然后从类文件创建 jar:
jar --create --file Pack.jar Pack.class
在 classpath 上从 jar 运行类:
java -cp Pack.jar Pack
屏幕显示 packed。在这种教学形态下,你不是用散落的类去执行 java Pack。你让 JVM 从 Pack.jar 加载 Pack。

Pack jar -cp prints packed

java
public class Pack {
    public static void main(String[] args) {
        System.out.println("packed");
    }
}

把路径走一遍。javac Pack.java 生成 Pack.class。jar --create --file Pack.jar Pack.class 把该类打进 Pack.jar。java -cp Pack.jar Pack 启动 Pack.main。println 写出 packed。不会跑任何 @Test。不会跑任何 t.name()。不会跑任何 stream().map。
看着文件夹时说出新手规则:编译源码,从 .class 创建 jar,用 -cp 加 public 类名运行。本页不要在 Pack.java 里发明 JUnit 检查。不要把 jar 当成第二个编译器 — javac 仍然生成类;jar 只负责打包。
若残留的 SumCheck 文件还在显示绿色 JUnit 报告,请切换到 Pack 并保留 packed 那一行。若 jar 找不到 Pack.class,在创建归档前先重新编译。

带 Main-Class 的 jar,用 -jar 运行

仍保持 public 类 Pack。改一下打印内容,方便命名第二种教学形态:
System.out.println("shipped");
再次编译:
javac Pack.java
创建会记录入口类的 jar:
jar --create --file Pack.jar --main-class Pack Pack.class
用 jar 启动器运行:
java -jar Pack.jar
屏幕显示 shipped。--main-class Pack 告诉 jar 哪个 public 类持有 main。java -jar 读取该入口并启动。每种教学形态只保留一行清晰打印,屏幕上的词才好命名。

Pack jar -jar prints shipped

java
public class Pack {
    public static void main(String[] args) {
        System.out.println("shipped");
    }
}

把路径走一遍。javac Pack.java 刷新 Pack.class。jar --create --file Pack.jar --main-class Pack Pack.class 打包类并保存入口名。java -jar Pack.jar 启动 Pack.main。屏幕显示 shipped。把两个演示当作两种教学形态。先证明需要 packed 的 -cp 运行,再证明需要 shipped 的 -jar 运行。两种形态共享 public 类 Pack 和 jar --create --file 习惯。
若在未写入 --main-class 的 jar 上执行 java -jar Pack.jar,启动器会失败,因为没有存储入口类。那个失败的 jar 不是第二份教学文件。第二份教学文件包含 --main-class Pack。

JAR 习惯

创建、classpath 运行、Main-Class 和 -jar 运行,对新手仍是分开的四步。

📊 JAR habits for Pack

习惯 形态 新手检查
创建 jar --create --file Pack.jar Pack.class 把 Pack.class 打进 Pack.jar
Classpath 运行 java -cp Pack.jar Pack 第一个演示屏幕显示 packed
Main-Class jar --create --file Pack.jar --main-class Pack Pack.class 保存入口类 Pack
Jar 运行 java -jar Pack.jar 第二个演示屏幕显示 shipped
先编译 javac Pack.java 重建 jar 前先刷新 .class

JAR 不是 JUnit,也不是 Records

JUnit 用 @Test 标记检查并比较期望值。Records 保存紧凑组件,你用 accessor 打印。JAR 为分发和运行打包类文件。今天不要把这三种职责混在一个新手文件里。
此处的 packed 是第一个演示在 -cp jar 运行里 Pack.main 的屏幕词。它不是 assertEquals(5, ...),也不是 Tag record 的 t.name()。当残留的 SumCheck 还在谈期望的 5,把它当历史,保留 Pack 的打印行。
没有 javac 就没有新鲜的 Pack.class 可打包。没有 jar --create 就没有 Pack.jar。没有 -cp 或带 Main-Class 的 -jar 路径,你就没展示本课的运行形态。本页不要 JUnit 注解。本页不要 record 头。

最后一页可选课上的文件夹检查

创建成功后列出文件夹。应同时看到 Pack.java、Pack.class 和 Pack.jar。编辑源码、保存、执行 javac Pack.java,用同样的 create 习惯重建 jar,再运行。若编辑后跳过 create,陈旧的 jar 可能掩盖改过的打印。
若 jar 抱怨缺少类文件,先编译。若 java -cp Pack.jar Pack 什么都不打印,确认 main 仍调用 println。若 java -jar Pack.jar 提示没有 main manifest attribute,用 --main-class Pack 重建。
不要把 SumCheck 的 @Test 贴进 Pack。不要把 Card 的 record Tag 当作打包的替代品。可选 JAR 任务是你用 -cp 或 -jar 运行的类文件归档。

可选路径结束

你可以保留 public 类 Pack,打印 packed,用 javac Pack.java 编译,用 jar --create --file Pack.jar Pack.class 创建 Pack.jar,运行 java -cp Pack.jar Pack,再打印 shipped,用 --main-class Pack 重建,并运行 java -jar Pack.jar。表格把 create、classpath、Main-Class 和 jar 运行分开。这是课程地图上最后一个可选 Java 页面。
为清晰的打包配对保留 Pack 演示。练 jar 时把 SumCheck JUnit 文件留在这页之外。练 jar 时把 Card Records 文件留在这页之外。本页不要发明新的可选主题 — 地图在此结束。这些习惯是可选路径的检查点。第一次运行显示 packed 或第二次显示 shipped,本课的 JAR 就完成了。
最后再看一遍文件夹:一个 public Pack、匹配的 .class、Pack.jar 在、create 命令记得、-cp 或 -jar 运行与当前打开的演示一致、没有 Scanner 等待、不需要断言。再编译、重建 jar,在你保持打开的演示上再运行一次。若屏幕仍显示 packed 或 shipped,JAR 形态稳固,可选 Java 路径完成。每次阅读只保留一种清晰的打包习惯,让每一遍都教同一张地图。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部