目录什么是 JAR 文件?使用 jar 命令创建 JAR 文件步骤 1:编写并编译 Java 代码步骤 2:创建清单文件步骤 3:创建 JAR 文件步骤 4:验证 JAR 文件内容运行 JAR 文件使用 Maven 创建 JAR 文件步骤 1:设置 Maven 项目步骤 2:配置 pom.xml步骤 3:包含依赖项(创建胖 JAR)示例:添加依赖高级主题使用 Maven Shade 插件使用 jpackage 工具常见问题与注意事项总结在 Java 开发中,JAR(Java Archive)文件是一种核心的分发格式,用于将多个类文件、元数据和资源打包成一个压缩文件。JAR 文件不仅便于应用程序的部署,还可以通过配置清单文件(manifest)使其成为可执行文件。本文将深入探讨如何使用 JDK 的jar工具手动创建 JAR 文件,以及如何利用 Maven 自动化这一过程。我们将通过清晰的示例和步骤,确保内容深入浅出,为技术人员提供实用的指导。本文的目标是帮助您:理解 JAR 文件的作用和结构。掌握使用jar工具创建可执行 JAR 文件的方法。学习如何配置 Maven 以生成包含依赖的 JAR 文件。了解高级工具(如jpackage)的潜在用途。什么是 JAR 文件?JAR 文件是基于 ZIP 和 ZLIB 压缩格式的归档文件,主要用于打包 Java 应用程序或库的组件,包括:类文件:编译后的.class文件,包含 Java 程序的字节码。资源文件:如图片、配置文件或音频文件。清单文件:位于META-INF/MANIFEST.MF,包含文件的元数据和属性。JAR 文件的主要优势包括:高效分发:将所有相关文件打包为单一文件,便于传输。压缩:减少文件大小,加快下载速度。可执行性:通过指定Main-Class属性,JAR 文件可以直接运行。模块化:自 JDK 9 起,JAR 文件支持模块化打包(模块化 JAR)。使用 jar 命令创建 JAR 文件JDK 提供的jar工具是创建和操作 JAR 文件的标准工具。以下是通过命令行创建可执行 JAR 文件的步骤。步骤 1:编写并编译 Java 代码假设我们有一个简单的 Java 程序HelloWorld.java,位于com.somedomainhere包中:package com.somedomainhere;
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World of Java");}}在命令行中,编译该文件:javac com/somedomainhere/HelloWorld.java这将在com/somedomainhere目录下生成HelloWorld.class文件。步骤 2:创建清单文件要使 JAR 文件可执行,需要一个清单文件来指定主类。创建一个名为manifest.stub的文本文件,内容如下:Main-Class: com.somedomainhere.HelloWorld注意:Main-Class属性区分大小写,且冒号后必须有一个空格。文件必须以换行符结尾,否则可能导致解析错误。步骤 3:创建 JAR 文件假设当前目录结构如下:.└── com└── somedomainhere└── HelloWorld.class在包含com目录的根目录下,运行以下命令:jar cvmf manifest.stub hello.jar com/somedomainhere/HelloWorld.class命令参数说明:c:创建新的归档文件。v:显示详细输出(verbose)。m:包含指定的清单文件(manifest.stub)。f:指定输出文件名(hello.jar)。执行后,将生成hello.jar,其中包含正确的包结构(com/somedomainhere/HelloWorld.class)和清单文件。步骤 4:验证 JAR 文件内容您可以使用以下命令查看 JAR 文件的内容:jar tf hello.jar输出示例:META-INF/
META-INF/MANIFEST.MF
com/
com/somedomainhere/
com/somedomainhere/HelloWorld.class运行 JAR 文件创建 JAR 文件后,可以通过以下命令运行:java -jar hello.jarjava -jar命令会读取清单文件中的Main-Class属性,并执行指定的主类。运行上述命令将输出:Hello, World of Java在支持的 GUI 平台(如 Windows、macOS 或某些 Linux 桌面环境)上,您可以双击 JAR 文件运行,前提是系统已将.jar文件关联到 Java 运行时环境(JRE)。注意:确保已安装 Java 运行时环境(JRE)或 JDK。如果 JAR 文件缺少Main-Class属性或主类不存在,将抛出异常。使用 Maven 创建 JAR 文件对于大型项目,手动创建 JAR 文件可能效率低下。Maven 是一种流行的构建工具,可以自动化编译、打包和依赖管理。以下是如何使用 Maven 创建可执行 JAR 文件的步骤。步骤 1:设置 Maven 项目创建一个标准的 Maven 项目,目录结构如下:hello-world/├── pom.xml└── src└── main└── java└── com└── somedomainhere└── HelloWorld.javaHelloWorld.java的内容与之前相同。步骤 2:配置 pom.xml在pom.xml中,指定项目的基本信息和插件配置。以下是一个基本的配置,用于生成可执行 JAR 文件:
:指定项目打包为 JAR 文件。maven-compiler-plugin:设置 Java 编译版本(这里使用 Java 8)。maven-jar-plugin:配置清单文件,指定主类。运行以下命令生成 JAR 文件:mvn clean package这将在target目录下生成hello-world-1.0-SNAPSHOT.jar。您可以运行:java -jar target/hello-world-1.0-SNAPSHOT.jar步骤 3:包含依赖项(创建胖 JAR)如果您的项目有外部依赖(如第三方库),上述 JAR 文件不包含这些依赖,运行时可能抛出ClassNotFoundException。要创建包含所有依赖的“胖 JAR”,可以使用maven-assembly-plugin。在pom.xml中添加以下插件配置:运行以下命令:mvn clean package这将生成两个 JAR 文件:target/hello-world-1.0-SNAPSHOT.jar:不包含依赖的普通 JAR。target/hello-world-1.0-SNAPSHOT-jar-with-dependencies.jar:包含所有依赖的胖 JAR。运行胖 JAR:java -jar target/hello-world-1.0-SNAPSHOT-jar-with-dependencies.jar优点:胖 JAR 是自包含的,可以在任何安装了 Java 的环境中运行,无需额外配置类路径。便于分发,适合独立应用程序。注意:胖 JAR 可能显著增加文件大小,因为它包含所有依赖。确保依赖的许可证允许这种打包方式。示例:添加依赖假设您的程序使用 Apache Commons Lang 库。更新pom.xml添加依赖:修改HelloWorld.java使用该库:package com.somedomainhere;
import org.apache.commons.lang3.StringUtils;
public class HelloWorld {public static void main(String[] args) {String message = "hello, world of java";System.out.println(StringUtils.capitalize(message));}}重新运行mvn clean package,生成的胖 JAR 将包含 Commons Lang 库,运行时将输出:Hello, world of java高级主题使用 Maven Shade 插件虽然maven-assembly-plugin适用于大多数场景,但maven-shade-plugin提供了更高级的功能,如包重命名(shading)以避免类冲突。配置示例:运行mvn clean package将生成包含所有依赖的 JAR 文件。Shade 插件特别适合需要处理复杂依赖冲突的项目。使用 jpackage 工具自 Java 14 起,JDK 引入了jpackage工具,可创建平台特定的安装程序(如 Windows 的.exe或 macOS 的.dmg)。它将应用程序和 JRE 打包在一起,适合分发给非技术用户。示例命令:jpackage --input target --name HelloWorld --main-jar hello-world-1.0-SNAPSHOT.jar --main-class com.somedomainhere.HelloWorld由于jpackage超出了 JAR 文件的范围,建议有兴趣的读者参考Oracle 文档。常见问题与注意事项问题解决方案java -jar 抛出 no main manifest attribute确保清单文件中包含 Main-Class 属性,或在 jar 命令中使用 -e 选项指定主类。运行胖 JAR 时出现 ClassNotFoundException确认 maven-assembly-plugin 已正确配置,且所有依赖都包含在 JAR 中。JAR 文件过大考虑使用普通 JAR 并通过类路径管理依赖,或检查是否有不必要的依赖。双击 JAR 文件无法运行确保系统安装了 JRE,并将 .jar 文件关联到 javaw.exe。总结打包和运行 JAR 文件是 Java 开发中的核心技能。通过jar工具,您可以手动创建简单的 JAR 文件,适合小型项目或学习目的。而 Maven 提供了强大的自动化功能,能够处理复杂的依赖管理和构建流程,使其成为现代 Java 开发的首选工具。本文通过详细的示例和配置,展示了从基础到高级的 JAR 文件管理方法。无论您是初学者还是经验丰富的开发者,掌握这些技术将显著提高您的开发效率。建议进一步探索 Maven 的其他插件(如maven-shade-plugin)或jpackage工具,以满足更复杂的部署需求。以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。您可能感兴趣的文章:把Java程序打包成jar文件包并执行的方法Java程序打包成带参数的jar文件实例代码java -jar命令详解之运行JAR文件、传递参数与性能调优idea插件之如何使用JarEditor编辑Java JAR文件Java实现Jar文件的遍历复制与文件追加Java创建可执行JAR文件的多种方式
