尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

JAR 包详解:概念、结构、打包与依赖管理

JAR 包详解:概念、结构、打包与依赖管理 一、生活化理解先有个画面想象你要做一道“番茄牛腩面”原材料番茄、牛腩、面条、香料分散的打包好的方便面面饼调料包脱水蔬菜全在一个袋子里JAR 包你只要拆开袋子开水一泡就能吃引入 JAR 包就能直接用JAR 包就是 Java 世界的“方便面”——它把一堆编译好的.class文件、配置文件、资源文件打包成一个文件别人拿来就能用不用自己从头炒料。二、JAR 包的标准定义JARJava Archive是一种压缩文件格式基于 ZIP 格式用于聚合多个 Java 类文件、元数据和资源文件图片、配置文件等。作用分发把写好的功能打包发给别人。复用别人引入你的 JAR就能调用里面的类和方法。模块化按功能拆分如commons-lang.jar处理字符串mysql-connector.jar连接数据库。三、JAR 包内部结构打开看看用解压软件打开一个 JAR 包通常看到textmy-app.jar ├── META-INF/ │ └── MANIFEST.MF # 清单文件记录版本、主类等 ├── com/ │ └── example/ │ ├── Main.class # 编译后的字节码 │ └── Utils.class ├── config/ │ └── application.properties └── static/ └── logo.pngMANIFEST.MF很重要可执行 JAR 会在这里指定Main-Class入口类。四、怎么生成 JAR 包带代码操作场景1用jar命令手动打包写两个简单类Calculator.javajavapackage com.demo; public class Calculator { public int add(int a, int b) { return a b; } }MainApp.javajavapackage com.demo; public class MainApp { public static void main(String[] args) { Calculator calc new Calculator(); int result calc.add(10, 20); System.out.println(Result: result); } }编译bashjavac -d . Calculator.java MainApp.java会在当前目录生成com/demo/*.class打包成 JARbashjar cvf my-app.jar com/c创建v显示详细f指定文件名执行 JAR需要指定主类bashjava -cp my-app.jar com.demo.MainApp场景2制作“可执行 JAR”双击运行写一个MANIFEST.MF文件textManifest-Version: 1.0 Main-Class: com.demo.MainApp注意最后必须有一个空行。打包时把清单加进去bashjar cvfm my-exec.jar MANIFEST.MF com/运行bashjava -jar my-exec.jar五、开发中最常见的用法Maven/Gradle 管理依赖现实项目中几乎不用手动打包而是用构建工具。Maven 的pom.xml依赖片段xmldependency groupIdorg.apache.commons/groupId artifactIdcommons-lang3/artifactId version3.12.0/version /dependency当你执行mvn compileMaven 会自动从中央仓库下载commons-lang3-3.12.0.jar到本地~/.m2/repository/并加入 classpath。Gradle 的build.gradlegradledependencies { implementation org.apache.commons:commons-lang3:3.12.0 }六、代码里如何使用 JAR 包里的类假设你引入了commons-lang3.jar代码中直接 importjavaimport org.apache.commons.lang3.StringUtils; public class Demo { public static void main(String[] args) { // 判断字符串是否为空来自 JAR 包 boolean empty StringUtils.isEmpty( ); System.out.println(empty); // false因为空格不算空如果用isBlank则true // 反转字符串 String reversed StringUtils.reverse(hello); System.out.println(reversed); // olleh } }编译运行时的 classpath 必须包含该 JARbashjavac -cp commons-lang3-3.12.0.jar Demo.java java -cp .:commons-lang3-3.12.0.jar Demo # Windows用分号;七、JAR 包的“三大派系”类型说明典型例子普通 JAR只包含自己编译的类你的业务代码可执行 JARMANIFEST.MF 指定了Main-Class可用java -jar运行Spring Boot 打出的 fat jarFat JAR / Uber JAR把自己所有依赖的三方 JAR 都解压再重新打包成一个超大 JARSpring Boot 微服务部署包Spring Boot 的 Fat JAR 内部甚至还有BOOT-INF/lib目录存放依赖 JAR。八、一个完整“打包-引用”实战模拟真实协作步骤1A 同学写工具类打成 JAR 发给 B。工具类DateUtil.javajavapackage com.util; import java.time.LocalDate; public class DateUtil { public static String today() { return LocalDate.now().toString(); } }打包bashjavac -d . DateUtil.java jar cvf date-util.jar com/步骤2B 同学拿到date-util.jar复制到项目的lib/文件夹然后引用B 的主程序App.javajavaimport com.util.DateUtil; public class App { public static void main(String[] args) { System.out.println(Today is DateUtil.today()); } }编译运行bashjavac -cp lib/date-util.jar App.java java -cp .:lib/date-util.jar App九、常见面试/概念题JAR 和 WAR 的区别JAR普通 Java 应用或库WARWeb 应用归档包含 WEB-INF/web.xml、JSP、Servlet 等部署到 Tomcat/JettyJAR 包冲突怎么解决Maven 的dependency:tree查看依赖树用exclusion排除传递依赖或者升级/降级版本统一怎么查看 JAR 包里的类bashjar tf my-app.jar # 列出所有文件 javap -cp my-app.jar com.demo.Calculator # 反编译查看方法签名十、总结一句话JAR 包 Java 的压缩归档文件是代码复用的基本单元通过 classpath 引入可以被构建工具自动管理也可以手动打包分发。
返回列表