java -jar(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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:
- 编译代码:
javac Main.java
- 创建 MANIFEST 文件:
Manifest-Version: 1.0 Main-Class: Main
- 打包 JAR:
jar cfm my-app.jar MANIFEST.MF Main.class
- 运行 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 的最佳实践
使用构建工具自动化打包
对于中大型项目,手动操作容易出错,建议使用 Maven 或 Gradle 自动化打包。
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-plugin
或spring-boot-maven-plugin
)。
2. 性能优化:JAR 文件过大
解决方案:
- 使用
jlink
工具创建自定义 JDK 镜像,仅包含应用所需的模块。 - 对 JAR 文件进行压缩(如使用
-C
参数指定压缩级别)。
实战案例:部署一个 Spring Boot 应用
Spring Boot 项目天然支持 java -jar
运行,其构建过程已内置相关配置。
步骤:
- 创建 Spring Boot 项目(通过 Spring Initializr)。
- 编写主类:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 打包 JAR:
./mvnw clean package # Maven 项目
- 运行应用:
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 开发的基础,更是理解现代应用部署流程的关键一步。希望读者通过实践案例与代码示例,能够快速上手并灵活应用这一工具。