《苏语棠和李蓉蓉三兄弟》:一场意想不到的命运交织,引爆网络热议!

核心内容摘要

《瞒着妻丈夫参加漫展》
光影之下的极致沉溺:夏晴子那部让全网屏息的MV,究竟藏着怎样的灵魂?

申鹤脸红翻白眼流眼泪

java -jar是 Java 中运行可执行 JAR 包Executable JAR的核心命令其底层依托 JVM 类加载机制、JAR 包规范和程序入口约定实现核心逻辑是「JVM 解析 JAR 包元数据→加载指定主类→执行入口方法」以下从核心前提、完整启动流程、关键细节、与普通启动的区别四方面彻底讲清原理附实操验证和

注意事项。

核心前提可执行 JAR 包的特殊要求java -jar能启动的前提是JAR 包必须是「可执行 JAR」普通依赖 JAR 包仅含 class 文件无启动配置无法通过该命令运行。

可执行 JAR 包的核心标识是在META-INF/MANIFEST.MF文件中声明主类入口这是 JVM 识别「启动类」的唯一依据。

可执行 JAR 包的MANIFEST.MF核心配置该文件是 JAR 包的「元数据清单」java -jar启动时会优先读取其中的Main-Class属性格式要求严格冒号后必须有 1 个空格结尾无多余空行示例manifestManifest-Version:

0 Main-Class: com.example.DemoApplication # 核心指定程序入口主类含全类名 Class-Path: lib/commons-lang3-

3.

14.

jar lib/fastjson2-

2.

0.

jar # 可选依赖的外部JAR包路径Main-Class必填指定包含public static void main(String[] args)方法的主类全类名无.class后缀Class-Path可选声明当前 JAR 包依赖的外部 JAR 包相对路径多个依赖用空格分隔JVM 会按此加载依赖类格式要求属性名大小写固定冒号:后必须跟1 个空格否则 JVM 会解析失败。

普通 JAR 与可执行 JAR 的核心区别类型核心特征启动方式普通依赖 JAR仅含 class 文件无Main-Class无法java -jar仅作为其他项目的依赖被类加载可执行 JAR含Main-Class声明有主入口直接java -jar xxx.jar启动

java -jar xxx.jar完整启动流程JVM 视角当在命令行执行java -jar命令时JVM 会按固定步骤完成从「解析 JAR 包」到「执行 main 方法」的全过程无额外手动干预全程自动化步骤如下按执行顺序步骤 1JVM 解析命令行参数识别-jar标识JVM 启动器java.exe/java可执行文件首先解析命令行参数当检测到-jar标识时会触发 **「JAR 包启动模式」**后续逻辑均围绕「加载并运行可执行 JAR 包」展开同时忽略命令行中后续的其他类名参数仅以 JAR 包为核心。

步骤 2加载并解析 JAR 包中的META-INF/MANIFEST.MF文件JVM 会打开指定的 JAR 包如xxx.jar按规范读取其中META-INF目录下的MANIFEST.MF元数据文件核心做 2 件事校验文件格式是否合法如是否有Manifest-Version基础属性提取 **Main-Class属性值 **主类全类名若未找到该属性直接抛出异常no main manifest attribute, in xxx.jar最常见启动失败原因。

步骤 3基于 JAR 包创建专属的「JAR 类加载器JarClassLoader」Java 类加载遵循「双亲委派模型」但java -jar启动时JVM 会创建专属的 JarClassLoader继承自 URLClassLoader该类加载器的核心作用是以整个 JAR 包为「类加载源」负责从 JAR 包的压缩结构中加载所有 class 文件包括主类、业务类、内部依赖类若MANIFEST.MF中有Class-Path属性JarClassLoader 会同时将该属性声明的外部 JAR 包加入类加载路径按顺序加载外部依赖类。

核心特点JarClassLoader 仅加载当前 JAR 包及Class-Path声明的依赖与系统类加载器AppClassLoader隔离保证启动环境的独立性。

步骤 4通过 JarClassLoader 加载Main-Class指定的主类JarClassLoader 会根据Main-Class的全类名在 JAR 包中找到对应的 class 文件如com/example/DemoApplication.classJAR 包中类的路径与包结构一致并完成类的加载、链接、初始化类加载的三个阶段加载将 class 文件的二进制数据读入内存生成 Class 对象链接验证校验 class 文件合法性→ 准备为类变量分配内存→ 解析将符号引用转为直接引用初始化执行类的静态代码块、初始化静态变量完成类的初始化。

若主类加载失败如类不存在、依赖缺失、class 文件损坏会抛出ClassNotFoundException或NoClassDefFoundError异常启动终止。

步骤 5反射调用主类的public static void main(String[] args)方法主类加载完成后JVM 会通过Java 反射机制定位主类中的main方法核心要求是该方法必须满足固定签名java运行// 必须是 public static void参数为 String[]方法名严格为 main大小写敏感 public static void main(String[] args)JVM 会将命令行中 JAR 包后的参数如java -jar xxx.jar arg1 arg2封装为String[]数组传递给main方法并执行该方法此时程序正式启动进入业务逻辑执行阶段。

步骤 6程序运行与 JVM 生命周期绑定main方法是程序的「入口主线程」JVM 的生命周期会与该主线程绑定若主线程执行完毕无后台线程 / 守护线程JVM 会正常退出若主线程启动了其他用户线程如业务线程、定时任务JVM 会等待所有用户线程执行完毕后再退出若存在守护线程如垃圾回收线程守护线程会随 JVM 退出而终止。

关键细节与

常见问题解析

最常见启动失败no main manifest attribute, in xxx.jar原因JAR 包不是可执行 JARMANIFEST.MF中缺失Main-Class属性或属性格式错误如冒号后无空格解决重新打包为可执行 JAR确保MANIFEST.MF中正确声明Main-ClassIDEA/Maven/Gradle 打包时可自动配置。

Class-Path属性的使用

注意事项路径类型仅支持相对路径相对当前 JAR 包的运行目录不支持绝对路径分隔符多个依赖用空格分隔不是逗号示例Class-Path: lib/a.jar lib/b.jar加载规则JarClassLoader 会按Class-Path顺序加载外部依赖若依赖缺失会抛出ClassNotFoundException。

java -jar与普通java 主类名启动的核心区别很多人会混淆两种启动方式核心差异在类加载器和类加载路径具体对比启动方式类加载器类加载路径适用场景java -jar xxx.jarJarClassLoader仅 JAR 包内 Class-Path生产环境独立运行可执行程序java com.example.MainAppClassLoader系统类路径CLASSPATH开发环境快速运行依赖已在 CLASSPATH 中关键java -jar启动时系统环境变量 CLASSPATH 会被忽略所有依赖必须通过 JAR 包内或Class-Path声明保证程序运行不依赖外部环境配置。

命令行参数传递java -jar xxx.jar arg1 arg2传递规则JAR 包后的所有参数会被封装为String[]传递给主类的main方法示例执行java -jar demo.jar 8080 dev则main方法的args数组为{8080, dev}注意-jar前的参数是 JVM 参数如-Xmx512m、-Dspring.profiles.activedev后为程序参数示例bash运行# -Xmx512mJVM参数最大堆内存-Dxxx系统属性8080程序参数 java -Xmx512m -Dspring.profiles.activedev -jar demo.jar 8080

实操验证手动查看可执行 JAR 包的MANIFEST.MF可通过解压工具如 WinRAR/7-Zip直接打开 JAR 包进入META-INF目录用记事本打开MANIFEST.MF文件验证是否有Main-Class属性步骤找到可执行 JAR 包如demo.jar右键选择「解压到当前文件夹」进入解压后的META-INF目录打开MANIFEST.MF检查是否有Main-Class: 全类名配置格式是否正确冒号后有空格。

扩展Maven/Gradle 打包可执行 JAR 包的原理日常开发中我们不会手动编写MANIFEST.MF而是通过 Mavenmaven-jar-plugin/spring-boot-maven-plugin或 Gradle 插件自动打包核心原理是插件在打包时会根据配置的「主类全类名」自动生成MANIFEST.MF文件并写入Main-Class属性Spring Boot 可执行 JAR 包特殊会生成嵌套 JAR 结构同时声明Spring-Boot-Main-Class和Main-ClassMain-Class为 Spring Boot 启动器org.springframework.boot.loader.JarLauncher再由其加载实际业务主类。

核心

总结java -jar启动的前提是 JAR 包为「可执行 JAR」核心标识是META-INF/MANIFEST.MF中声明Main-Class完整启动流程解析-jar标识→读取 MANIFEST.MF→创建 JarClassLoader→加载主类→反射执行 main 方法JarClassLoader 是专属类加载器仅加载 JAR 包内及Class-Path声明的依赖忽略系统 CLASSPATH最常见失败原因是缺失Main-Class或格式错误解决方式是重新打包并正确配置主类-jar前为 JVM 参数如-Xmx、-D后为程序参数会传递给main方法的args数组。

在线观看已满十八岁电视剧直播-在线观看已满十八岁电视剧直播应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123