news 2026/4/15 15:46:20

三种方式打 Java 可执行 JAR 包,你用对了吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
三种方式打 Java 可执行 JAR 包,你用对了吗?

三种方式打 Java 可执行 JAR 包,你用对了吗?

写完代码只是开始,如何打包成一个“开箱即用”的 JAR 文件,才是交付的关键一步。

很多 Java 开发者都遇到过这样的问题:本地跑得好好的程序,一打包就报错ClassNotFoundException别慌,这很可能不是你的代码问题,而是——JAR 包没打好!

Maven 提供了多种打可执行 JAR 的方式。今天我们就来对比三种主流方案:

maven-jar-plugin(轻量外置依赖)

maven-assembly-plugin(全家桶打包)

maven-shade-plugin(高级防冲突版)

每种方式配真实pom.xml 配置 + 执行命令 + 输出结构,让你看完就能上手!


方式一:maven-jar-plugin—— “轻量但依赖外置”

它只打包你自己的代码,不包含第三方依赖,但会在MANIFEST.MF中指定依赖路径。

🔧 pom.xml 配置

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>org.example.App</mainClass> <addClasspath>true</addClasspath> <classpathPrefix>dependencies/</classpathPrefix> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/dependencies/</outputDirectory> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin> </plugins> </build>

📂 打包后结构

📂jar包解压后看长啥样

├── META-INF │ ├── MANIFEST.MF │ └── maven │ └── org.example │ └── java-demo │ ├── pom.properties │ └── pom.xml └── org └── example └── App.class

jar包中的MANIFEST.MF文件

Manifest-Version: 1.0 Created-By: Maven Jar Plugin 3.2.0 Build-Jdk-Spec: 17 Class-Path: dependencies/fastjson2-2.0.60.jar <-第三方依赖包在这里 Main-Class: org.example.App <-启动类

▶️ 执行命令

java -jar java-demo-1.0-SNAPSHOT.jar

✅ 优点:JAR 小、依赖清晰 ❌ 缺点:必须保证dependencies/目录在 JAR 同级,否则运行失败!


📦方式二:maven-assembly-plugin—— “全家桶打包”

生成一个fat jar,把你的代码 + 所有依赖的 class 全部塞进去。

🔧 pom.xml 配置

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <configuration> <finalName>java-demo</finalName> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>org.example.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>

📂 打包后结构

target/ ├── java-demo-jar-with-dependencies.jar ← 可执行 fat jar └── java-demo-1.0-SNAPSHOT.jar ← 原始包(不可执行)

📂可执行jar包的解压后长啥样?

jar包的MANIFEST.MF文件

Manifest-Version: 1.0 Created-By: Apache Maven 3.9.8 Built-By: Administrator Build-Jdk: 17.0.11 Main-Class: org.example.App

▶️ 执行命令

java -jar java-demo-jar-with-dependencies.jar

✅ 优点:一个文件搞定,部署简单 ❌ 缺点:依赖类直接合并,容易因同名类冲突导致运行时错误


🔒方式三:maven-shade-plugin—— “高级防冲突版”

不仅能打包所有依赖,还支持类重定位(relocation),从根本上避免类冲突。类重定位其实就是动态的移动、修改jar包中的类名、包名。

🔧 pom.xml 配置(基础版)

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 此处按需编写更具体的配置 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>org.example.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>

💡 如需解决冲突,可加<relocations>重命名包路径(此处略,按需扩展)。

📂 打包后结构

target/ ├── java-demo-1.0-SNAPSHOT.jar ← 可执行最终包,把项目中的代码及所依赖的第三方jar的Class文件都打进去了 └── original-java-demo-1.0-SNAPSHOT.jar ← 原始包(备份),不能直接执行,只包含项目中自有的代码,MENIFEST.MF文件中连Main-Class都没有。

📂可执行jar包的解压后长啥样?

jar包的MANIFEST.MF文件

Manifest-Version: 1.0 Created-By: Maven JAR Plugin 3.4.1 Build-Jdk-Spec: 17 Main-Class: org.example.App

▶️ 执行命令

java -jar java-demo-1.0-SNAPSHOT.jar

✅ 优点:支持类重定位、稳定性高、被 Spring Boot 等广泛采用 ❌ 缺点:JAR 体积大,配置略复杂


动态重命名包示例

如果最终的 jar 包被其他的项目所依赖的话, classpath 中可能存在重复的 class 文件,直接地引用此 jar 包中的类可能会导致类加载冲突。为了解决这个问题,我们可以使用 shade 提供的重定位功能,把部分类移动到一个全新的包中。

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>org.example.App</mainClass> </transformer> </transformers> <relocations> <relocation> <!--在打包时,将项目中的原始包com.alibaba.fastjson2,重命名为com.asia.fastjson2--> <pattern>com.alibaba.fastjson2</pattern> <shadedPattern>com.asia.fastjson2</shadedPattern> <!--排除以下类路径,保持不动--> <excludes> <exclude>com.alibaba.fastjson2.JSON</exclude> <exclude>com.alibaba.fastjson2.filter.*</exclude> </excludes> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build>

涉及标签:

  • <pattern>:原始包名
  • <shadedPattern>:重命名后的包名
  • <excludes>:原始包内不需要重定位的类,类名支持通配符
jar包解压后看什么样?

. ├── com │ ├── alibaba │ │ └── fastjson2 │ │ ├── filter │ │ └── JSON.class │ └── asia │ └── fastjson2 │ ├── annotation │ ├── codec │ ├── function │ ├── internal │ ├── 省略。。。 │ ├── TypeReference.class │ ├── util │ └── writer ├── META-INF │ ├── MANIFEST.MF │ ├── maven │ │ ├── com.alibaba.fastjson2 │ │ │ └── fastjson2 │ │ └── org.example │ │ └── java-demo │ ├── native-image │ │ └── com.alibaba.fastjson2 │ │ └── fastjson2 │ ├── proguard │ │ └── fastjson2.pro │ ├── scm │ │ └── com.alibaba.fastjson2 │ │ └── fastjson2 │ └── versions │ └── 9 │ └── module-info.class ├── org │ └── example │ └── App.class └── schema ├── 2020-12.json └── draft-04.json

🎯 一张表看懂怎么选

插件是否含依赖是否可直接运行能否防冲突推荐场景
maven-jar-plugin❌(外置)✅(需依赖目录)轻量部署、依赖独立管理
maven-assembly-plugin快速打包、简单项目
maven-shade-plugin✅(支持重定位)复杂项目、生产环境

标签:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 9:09:35

儿童青少年近视该如何科学防控家长是青少年近视防控的“守门人”

儿童青少年近视率的持续攀升&#xff0c;已成为影响国民健康的重要问题。近视不仅会给孩子的学习生活带来不便&#xff0c;还可能随着年龄增长发展为高度近视&#xff0c;引发眼底病变等潜在风险。在近视防控的全过程中&#xff0c;家长作为孩子成长的第一责任人&#xff0c;肩…

作者头像 李华
网站建设 2026/4/8 21:22:50

近视防控看这篇:儿童近视如何干预?什么方法才有效?

如今&#xff0c;儿童近视率逐年攀升&#xff0c;低龄化趋势更是愈演愈烈。不少家长在体检单上看到孩子的视力数值下滑时&#xff0c;满心担忧却不知从何入手。其实家长们要明白&#xff0c;儿童近视干预从来不是 “一招制胜” 的事&#xff0c;更需要融入日常的科学防控。一、…

作者头像 李华
网站建设 2026/4/6 11:51:39

Spring状态机深度解析:从入门到生产实战

Spring State Machine是Spring生态系统中一个强大的状态机框架&#xff0c;它让复杂的状态流转变得优雅而简单。本文将带你从基础概念出发&#xff0c;逐步深入理解并掌握Spring状态机在实际生产环境中的应用。一、状态机是什么&#xff1f;为什么要用它&#xff1f;想象一下订…

作者头像 李华
网站建设 2026/4/15 15:28:02

主流BI工具对比:帆软、Quick BI 与 Tableau 全面解析

在当今数据驱动的时代&#xff0c;企业对数据分析和可视化的需求日益增长。商业智能&#xff08;Business Intelligence, BI&#xff09;工具作为连接数据与决策的桥梁&#xff0c;已成为企业数字化转型的核心组成部分。市场上涌现出众多优秀的BI平台&#xff0c;其中帆软&…

作者头像 李华
网站建设 2026/4/15 15:20:52

GitLab与DeepSeek协同实现MR自动评审实践指南

GitLab与DeepSeek协同实现MR自动评审实践指南摘要本文详细探讨如何利用GitLab的CI/CD能力与DeepSeek智能引擎相结合&#xff0c;构建自动化代码评审系统。该系统能够在合并请求&#xff08;MR&#xff09;提交时自动执行代码质量分析&#xff0c;生成结构化评审报告并提出优化建…

作者头像 李华