Java案例怎么打包Jar包?

wen java案例 69

Java案例如何打包为Jar包?完整实战指南

📖 文章导读

  1. 什么是Jar包?为什么需要打包?
  2. 准备工作:环境与项目结构
  3. 使用命令行手动打包(基础篇)
  4. 使用Eclipse/IntelliJ IDEA打包(IDE篇)
  5. 使用Maven/Gradle构建打包(工程篇)
  6. 常见问题与解决方案(FAQ)
  7. 打包Jar的最佳实践

什么是Jar包?为什么需要打包?

Q1:Jar包到底是什么?
A:Jar(Java Archive)是Java的归档文件,基于ZIP格式,用于将多个Java类文件、元数据、资源文件(如配置文件、图片)打包成一个文件,你可以把它理解为Java项目的“可执行压缩包”。

Java案例怎么打包Jar包?

Q2:为什么要将Java案例打包成Jar包?

  • 部署方便:只需一个文件即可在任意安装JRE的机器上运行。
  • 依赖隔离:将项目所有依赖(包括第三方库)打包进Jar,避免环境差异。
  • 版本控制:Jar文件名可包含版本号(如myapp-1.0.jar),便于管理。
  • 命令行友好:通过java -jar myapp.jar即可启动,无需配置classpath。

任何Java程序员在面试或实际工作中,100%会碰到打包Jar的需求。


准备工作:环境与项目结构

1 环境要求

  • JDK 8+(推荐JDK 11以上)
  • 任意文本编辑器或IDE(本文会涵盖手动与IDE两种方式)

2 示例项目结构

我们以一个简单的“计算器”案例为例,目录如下:

CalculatorApp/
├── src/
│   └── com/
│       └── example/
│           ├── Calculator.java
│           └── Main.java
└── manifest.mf   (手动打包时需要)

Main.java 包含public static void main(String[] args)方法,作为程序入口。

3 关键概念:MANIFEST.MF文件

Jar包内部包含一个META-INF/MANIFEST.MF文件,用于指定:

  • Main-Class:入口类的全限定名
  • Class-Path:依赖路径
  • 版本信息等

方法一:使用命令行手动打包(基础篇)

适用场景:无IDE、学习底层原理、小型项目。

步骤(Linux / macOS / Windows CMD)

编译所有Java文件
# 进入项目根目录
cd CalculatorApp
# 编译src下的所有java文件,输出到out目录
javac -d out src/com/example/*.java
创建MANIFEST.MF文件

在项目根目录创建文件manifest.mf如下:

Manifest-Version: 1.0
Main-Class: com.example.Main

注意:最后必须有一个空行,否则jar命令可能忽略Main-Class

打包为Jar
jar cfm Calculator.jar manifest.mf -C out .
  • c:创建新jar
  • f:指定输出文件名
  • m:使用自定义manifest文件
  • -C out .:切换到out目录,将当前目录内容(即class文件)加入jar
运行验证
java -jar Calculator.jar

优缺点

优点 缺点
无依赖,仅需JDK 手动管理依赖繁琐
理解Jar本质 不支持第三方jar自动打包

方法二:使用Eclipse/IntelliJ IDEA打包(IDE篇)

适用场景:IDE日常开发、中小型项目管理。

1 IntelliJ IDEA 打包步骤

  1. 打开项目,点击菜单栏 FileProject Structure(或快捷键Ctrl+Alt+Shift+S)。
  2. 选择 Artifacts → → JARFrom modules with dependencies
  3. 选择主类(Main Class)。
  4. 勾选 extract to the target JAR(将依赖解压到Jar中)。
  5. 确认输出目录后点击 OK
  6. 构建:BuildBuild ArtifactsBuild

2 Eclipse 打包步骤

  1. 右键项目 → ExportJavaRunnable JAR file
  2. 选择启动类和导出路径。
  3. 选择库处理方式(推荐:Package required libraries into generated JAR)。
  4. 点击完成。

Q3:IDE打包和手动打包有何区别?
A:IDE会自动处理依赖、资源文件、MANIFEST.MF,甚至支持打“Fat Jar”(包含所有依赖),手动打包则适合精确控制打包内容。


方法三:使用Maven/Gradle构建打包(工程篇)

适用场景:企业级项目、多模块、依赖管理复杂。

1 Maven打包(最常用)

配置pom.xml
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.example.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 打Fat Jar插件(包含依赖) -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals><goal>shade</goal></goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
执行打包命令
mvn clean package

生成文件位于target/目录下,通常有两种:

  • original-xxx.jar(仅项目类,不含依赖)
  • xxx.jar(含有依赖的Fat Jar)

2 Gradle打包

build.gradle关键配置
plugins {
    id 'java'
    id 'application'
}
mainClassName = 'com.example.Main'
jar {
    manifest {
        attributes 'Main-Class': 'com.example.Main'
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
执行命令
gradle clean build

Q4:Fat Jar和普通Jar有什么区别?
A:普通Jar只包含项目自身的class文件,Fat Jar(或Uber Jar)将所有依赖(第三方库)也打包进同一个文件,实现“单文件可运行”,生产环境强烈推荐使用Fat Jar。


常见问题与解决方案(FAQ)

问题 原因 解决
java -jar 报“No main manifest attribute” 未指定Main-Class 检查MANIFEST.MF或IDE配置
ClassNotFoundException 依赖未打包进Jar 使用Fat Jar或设置Class-Path
中文乱码 编译编码问题 javac -encoding UTF-8
Jar包无法双击运行 系统无法识别jar关联(Windows) 使用java -jar命令
第三方jar引入失败 (Maven) 仓库地址错误或依赖名错误 检查pom.xml依赖或使用mvn dependency:tree

Q5:如何查看Jar包内部结构?
A:使用命令jar tf myapp.jar,或直接用解压软件(WinRAR/7-Zip)打开。


打包Jar的最佳实践

  1. 小型项目/学习:优先使用IntelliJ IDEA的Artifacts功能,高效准确。
  2. 企业级项目:必须使用Maven或Gradle,配合maven-shade-plugingradle-configuration打Fat Jar。
  3. 测试场景:手动打包有助于理解Jar本质,但不要用于生产。
  4. 版本命名:推荐使用项目名-版本号.jar(如calculator-1.0.jar)。
  5. 安全注意:不要将数据库密码、密钥硬编码到Jar包中,应使用外部配置文件。

如果你的Java案例需要分享给他人(比如面试演示、开源项目),务必打包为Fat Jar并附带运行说明,掌握几种打包方式,你就能从容应对从个人练习到企业级部署的任何场景。


延伸阅读

本文由技术实战经验总结而来,所有示例均经过测试,适用于JDK 8~21。

抱歉,评论功能暂时关闭!