在Java开发中,将项目打包成可执行JAR包是常见的部署方式,而jar命令是Java开发工具包(JDK)提供的用于操作JAR文件的核心工具,通过jar命令,开发者可以将.class文件、资源文件、依赖库等整合到一个归档文件中,最终生成一个可独立运行的应用程序,本文将详细介绍jar命令的使用方法、可执行JAR包的构建原理及常见实践。

jar命令的基本语法与选项
jar命令的基本语法格式为:jar [选项] [jar文件] [文件清单] [输入文件],常用选项包括:
c:创建新的JAR文件;t:列出JAR文件的内容;x:从JAR文件中提取文件;u:更新已存在的JAR文件;v:在输出中生成详细信息;f:指定JAR文件的名称;m:包含指定的清单文件(MANIFEST.MF);e:设置主类入口(用于可执行JAR包)。
创建一个名为app.jar的JAR文件并包含src目录下的所有.class文件,可执行命令:jar cvf app.jar -C src .,其中-C src .表示切换到src目录并包含其下所有文件。
可执行JAR包的核心:MANIFEST.MF文件
可执行JAR包的关键在于META-INF/MANIFEST.MF文件,该文件定义了JAR包的运行参数,尤其是主类入口,通过m选项可将自定义的MANIFEST.MF文件打包到JAR中,创建一个manifest.txt为:
Main-Class: com.example.Main
Class-Path: lib/library1.jar lib/library2.jar
其中Main-Class指定程序入口类,Class-Path声明依赖库的相对路径,随后执行命令:jar cvfm app.jar manifest.txt -C bin .,即可将主类和依赖信息打包到JAR中。

处理依赖库的三种常见方式
手动管理依赖
将所有依赖库(如JAR文件)放入lib目录,并在MANIFEST.MF中通过Class-Path声明,运行时需确保JAR包与lib目录的相对路径正确。
使用Maven/Gradle构建工具
现代项目通常使用Maven或Gradle自动化构建,以Maven为例,通过maven-jar-plugin配置MANIFEST.MF,并使用maven-shade-plugin或maven-assembly-plugin将依赖库打包到单一JAR中(称为“胖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>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
执行mvn package后,生成的JAR将包含所有依赖,可直接通过java -jar app.jar运行。
模块化JAR(Java 9+)
Java 9引入了模块系统,可通过jdeps工具分析依赖,并使用jar --create-module生成模块化JAR,这种方式更适合大型项目,能实现更精细的依赖隔离。

运行与调试可执行JAR包
运行可执行JAR包的基本命令为:java -jar app.jar,若需调试,可添加-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005参数,启用JDWP远程调试,通过jar tf app.jar可查看JAR包内容,jar xf app.jar可解压文件进行分析。
常见问题与解决方案
-
“主类未找到”错误
原因:MANIFEST.MF中的Main-Class路径不正确或未指定。
解决:检查类名格式(需包含完整包名,如com.example.Main),并确保jar命令中m选项与清单文件的对应关系正确。 -
依赖库加载失败
原因:Class-Path路径错误或依赖未打包。
解决:若使用手动依赖,确保lib目录与JAR包同级;若使用构建工具,检查插件配置是否包含依赖传递(如Maven的shade-plugin会自动处理依赖)。
相关问答FAQs
Q1: 如何查看JAR包中MANIFEST.MF的内容?
A1: 可通过jar xf app.jar META-INF/MANIFEST.MF解压后查看,或直接执行jar xf app.jar META-INF/查看整个目录结构,使用unzip -p app.jar META-INF/MANIFEST.MF(需安装unzip工具)也可快速输出内容。
Q2: 为什么生成的可执行JAR包在其他电脑上运行时报错“无法找到主类”?
A2: 通常是由于环境变量问题或JDK版本不兼容导致,确保目标电脑安装了对应版本的JDK,并尝试使用完整命令java -cp app.jar com.example.Main运行(忽略MANIFEST.MF中的主类配置),以排除JAR包本身的问题,若仍失败,需检查依赖库是否完整或路径是否正确。
