java -jar(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在 Java 开发的世界中,java -jar 命令如同一把钥匙,能够打开独立运行 Java 应用程序的大门。无论是构建微服务、启动 Spring Boot 项目,还是运行简单的工具脚本,掌握 java -jar 的使用方法都是开发者的必备技能。本文将从零开始,逐步解析这一命令的核心原理、实践技巧以及常见问题,帮助读者在实际开发中灵活运用这一工具。


什么是 java -jar

java -jar 是 Java 运行时环境(JRE)提供的一个命令行参数,用于直接执行打包成 JAR(Java Archive)格式的 Java 程序。

  • JAR 文件:类似于 ZIP 文件,但专为 Java 设计,可以包含编译后的 .class 文件、资源文件(如配置文件、图片)以及元数据(如 MANIFEST.MF)。
  • -jar 参数:告诉 JVM(Java 虚拟机)直接运行指定的 JAR 文件,而无需手动指定主类或类路径。

比喻:想象 JAR 文件是一个包裹,里面装着所有运行程序所需的“建筑材料”(代码和资源),而 java -jar 就是快递员,负责将包裹送达并启动整个工程。


如何使用 java -jar

1. 基础用法

执行一个 JAR 文件的命令格式如下:

java -jar your-application.jar  

关键条件

  • JAR 文件必须包含 META-INF/MANIFEST.MF 文件,其中需指定 Main-Class 属性,指向程序的入口类(即包含 public static void main(String[] args) 方法的类)。

示例
假设我们有一个简单的 Java 程序:

// Main.java  
public class Main {  
    public static void main(String[] args) {  
        System.out.println("Hello, Java -jar World!");  
    }  
}  

将代码编译后,通过以下步骤打包为可执行 JAR:

  1. 编译代码
    javac Main.java  
    
  2. 创建 MANIFEST 文件
    Manifest-Version: 1.0  
    Main-Class: Main  
    
  3. 打包 JAR
    jar cfm my-app.jar MANIFEST.MF Main.class  
    
  4. 运行 JAR
    java -jar my-app.jar  
    

此时,终端会输出 Hello, Java -jar World!


进阶用法:参数与配置

2. 指定 JVM 参数

java -jar 命令中,可以在 -jar 前添加 JVM 参数(如内存设置、垃圾回收选项等),以优化程序运行环境。例如:

java -Xmx512m -jar your-app.jar  # 设置最大堆内存为 512MB  

3. 处理外部依赖

如果应用依赖其他 JAR 文件(如第三方库),可以通过以下方式处理:

  • 将依赖打包进主 JAR:使用工具如 jar 命令或构建工具(Maven/Gradle)合并依赖。
  • 通过 -cp 参数指定类路径
    java -cp "your-app.jar:lib/*" -jar your-app.jar  
    

    注意:此方法依赖 JVM 版本支持,部分版本可能不兼容。


构建可执行 JAR 的最佳实践

使用构建工具自动化打包

对于中大型项目,手动操作容易出错,建议使用 MavenGradle 自动化打包。

Maven 配置示例

pom.xml 中添加 maven-jar-plugin

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <version>3.2.0</version>  
            <configuration>  
                <archive>  
                    <manifest>  
                        <mainClass>com.example.Main</mainClass>  
                    </manifest>  
                </archive>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  

执行 mvn package 后,生成的 JAR 文件即可直接通过 java -jar 运行。

Gradle 配置示例

build.gradle 中添加:

jar {  
    manifest {  
        attributes 'Main-Class': 'com.example.Main'  
    }  
}  

执行 gradle build 后,JAR 文件位于 build/libs/ 目录。


常见问题与解决方案

1. 错误:Could not find or load main class

原因

  • MANIFEST.MF 中的 Main-Class 路径错误(需包含包名,如 com.example.Main)。
  • JAR 文件未正确包含依赖或类文件。

解决方法

  • 检查 MANIFEST.MF 内容是否正确。
  • 使用构建工具确保依赖被正确打包(如 Maven 的 maven-assembly-pluginspring-boot-maven-plugin)。

2. 性能优化:JAR 文件过大

解决方案

  • 使用 jlink 工具创建自定义 JDK 镜像,仅包含应用所需的模块。
  • 对 JAR 文件进行压缩(如使用 -C 参数指定压缩级别)。

实战案例:部署一个 Spring Boot 应用

Spring Boot 项目天然支持 java -jar 运行,其构建过程已内置相关配置。

步骤:

  1. 创建 Spring Boot 项目(通过 Spring Initializr)。
  2. 编写主类
    @SpringBootApplication  
    public class Application {  
        public static void main(String[] args) {  
            SpringApplication.run(Application.class, args);  
        }  
    }  
    
  3. 打包 JAR
    ./mvnw clean package  # Maven 项目  
    
  4. 运行应用
    java -jar target/your-spring-boot-app.jar  
    

此时,应用会启动并监听默认端口(如 8080)。


总结

通过本文的讲解,读者应已掌握以下核心内容:

  • java -jar 的基本原理与使用场景。
  • 如何通过手动或构建工具生成可执行 JAR 文件。
  • 常见问题的排查与优化方法。

延伸思考:随着云原生技术的发展,java -jar 在容器化部署(如 Docker)中仍扮演重要角色。例如,可以通过以下命令将 JAR 文件打包为 Docker 镜像:

docker build -t my-java-app .  # 假设 Dockerfile 包含 CMD ["java", "-jar", "your-app.jar"]  

掌握 java -jar 不仅是 Java 开发的基础,更是理解现代应用部署流程的关键一步。希望读者通过实践案例与代码示例,能够快速上手并灵活应用这一工具。

最新发布