杰瑞科技汇

Java jar包运行命令怎么写?

Java -jar 运行jar包终极指南:从入门到精通,一篇搞定所有!

** 还在为java -jar命令报错而烦恼?本文详细解析命令参数、常见问题与高级技巧,助你轻松掌握Java应用程序的启动与部署。

Java jar包运行命令怎么写?-图1
(图片来源网络,侵删)

引言:为什么“java -jar”是Java开发者的必备技能?

在Java的世界里,将应用程序打包成可执行的JAR(Java Archive)文件是一种非常普遍的部署方式,无论是Spring Boot的“fat jar”,还是传统的多模块项目打包,最终都离不开一个核心命令:java -jar

你是否也曾遇到过以下困惑:

  • java -jar myapp.jar 提示“找不到主清单属性”?
  • 如何在后台运行jar包,关闭终端后程序依然存活?
  • 怎样给jar包传递自定义的启动参数?
  • 如何查看一个jar包内部依赖和版本信息?

如果你对这些问题点头,那么恭喜你,你已经来到了正确的页面,本文将作为你的“导航仪”,带你彻底搞懂java -jar的方方面面,让你从“只会用”到“精通用”,真正解决实际工作中的痛点。


第一部分:基础篇 - “java -jar”命令详解

1 核心命令格式

最基本、最常用的java -jar命令格式如下:

Java jar包运行命令怎么写?-图2
(图片来源网络,侵删)
java -jar <jar-file-path> [args...]
  • java: 这是Java虚拟机命令行工具,确保你的系统已经安装了JDK或JRE,并且JAVA_HOME环境变量配置正确。
  • -jar: 这是一个关键的命令行选项,它告诉JVM:“我要从这个JAR文件中运行一个程序”,使用此选项时,JVM会自动在JAR文件的META-INF/MANIFEST.MF文件中寻找Main-Class属性,并执行该类的主方法。
  • <jar-file-path>: 你要运行的JAR文件的完整路径或相对路径。
  • [args...]: 这是传递给主程序的命令行参数,如果你的程序需要接收外部输入,这部分就派上用场了。

示例: 假设你的JAR包名为my-app-1.0.0.jar,位于当前目录下,运行它:

java -jar my-app-1.0.0.jar

如果你想传递参数,比如--env=prod--port=8081

java -jar my-app-1.0.0.jar --env=prod --port=8081

2 JAR包的“灵魂”:MANIFEST.MF 文件

-jar选项能正常工作的前提是,你的JAR包必须包含一个正确的MANIFEST.MF文件,它通常位于JAR根目录/META-INF/下。

这个文件的核心作用是定义JAR包的元数据,其中最重要的就是Main-Class属性。

Java jar包运行命令怎么写?-图3
(图片来源网络,侵删)

MANIFEST.MF 示例:

Manifest-Version: 1.0
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_312
Main-Class: com.example.MyApplication
  • Main-Class: com.example.MyApplication:这行指定了程序的入口点,即包含public static void main(String[] args)方法的类。注意:这里的类名不需要包含.class后缀,并且路径使用点分隔。

如果你在打包时遇到“no main manifest attribute, in my-app.jar”错误,几乎可以肯定是MANIFEST.MF文件中缺少或错误定义了Main-Class属性,对于Maven或Gradle用户,通常有专门的插件来帮你自动生成这个文件。


第二部分:进阶篇 - 常用参数与技巧

掌握了基础命令,我们来看看如何通过参数来控制JVM和应用程序的行为,这往往是区分新手和老手的关键。

1 JVM参数:优化性能与调试

-jar之前添加的参数是传递给JVM的,用于控制内存分配、垃圾回收、日志级别等。

  • 设置堆内存大小 (最常用)

    • -Xms: 初始化堆内存大小。
    • -Xmx: 最大堆内存大小。
    • 示例: 给JAR分配2GB的初始堆和4GB的最大堆。
      java -Xms2g -Xmx4g -jar my-app.jar
  • 设置元空间/永久代 (PermGen/Metaspace)

    • -XX:MetaspaceSize: 元空间初始大小。
    • -XX:MaxMetaspaceSize: 元空间最大大小。(在Java 8及以后版本推荐使用Metaspace替代PermGen)
    • 示例:
      java -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -jar my-app.jar
  • 启用GC日志 (排查内存问题的利器)

    • -Xloggc:gc.log: 将GC日志输出到指定文件。
    • 示例:
      java -Xms2g -Xmx2g -Xloggc:./logs/gc.log -jar my-app.jar

2 应用程序参数:动态配置

-jar之后添加的参数是传递给主方法main(String[] args)的,你的程序需要自己解析这些参数。

最佳实践: 使用成熟的命令行参数解析库,如:

  • Apache Commons CLI
  • JCommander
  • Picocli (现代Java项目中的热门选择)

3 后台运行:让程序“脱机”执行

在Linux或macOS系统上,最简单的方式是在命令末尾加上&符号。

nohup java -jar my-app.jar > app.log 2>&1 &

我们来分解这个强大的命令:

  • nohup: "No Hang Up"的缩写,意思是“不挂断”,它使得你的进程在退出终端后仍然可以继续运行。
  • > app.log: 将标准输出重定向到app.log文件。
  • 2>&1: 将标准错误输出重定向到标准输出,也就是和标准输出一起写入app.log
  • &: 让命令在后台执行,并立即返回一个进程ID。

Windows系统: 可以使用start命令,或者更推荐使用第三方工具如NSSM (Non-Sucking Service Manager)来将jar包注册为Windows服务,实现真正的后台和自启动。


第三部分:实战篇 - 常见问题与解决方案

问题1:'main' manifest attribute is missing

  • 原因分析: JAR包的MANIFEST.MF文件中没有定义Main-Class属性,或者定义错误。
  • 解决方案:
    1. 使用jar tf your-file.jar | grep MANIFEST检查是否存在META-INF/MANIFEST.MF
    2. 使用jar xf your-file.jar META-INF/MANIFEST.MF解压出来查看内容。
    3. 如果是Maven项目,检查pom.xml中的maven-jar-plugin配置是否正确指定了Main-Class
    4. 如果是Spring Boot项目,检查spring-boot-maven-pluginspring-boot-gradle-plugin是否正确配置。

问题2:Error: Could not find or load main class

  • 原因分析:
    • 你可能没有使用-jar选项,而是直接用java -cp <jar-path> <main-class>,并且-cp路径或类名有误。
    • 即使使用了-jar,但JAR包依赖了其他外部JAR包,而这些依赖没有被正确包含进来。
  • 解决方案:
    1. 确保使用-jar选项,这是最规范的启动方式。
    2. 如果是依赖问题,确保你的JAR是一个“uber/fat jar”(包含所有依赖),或者在启动时通过-classpath-cp选项显式指定所有依赖的路径。
      java -cp "my-app.jar:lib/*.jar" com.example.MyApplication

      (注意:Windows系统下路径分隔符是)

问题3:如何查看一个JAR包的依赖?

  • 使用IDEA/Eclipse等IDE 直接用IDE打开JAR文件,就能清晰地看到其内部结构。
  • 使用命令行工具
    • jar tf: 查看JAR包中的所有文件列表。
      jar tf my-app.jar
    • jdeps (JDK自带): 分析JAR包的类级依赖。
      jdeps my-app.jar

第四部分:高级篇 - 超越java -jar

对于生产环境,仅仅java -jar可能还不够。

1 使用进程管理工具:PM2

虽然PM2主要用于Node.js,但它也可以管理任何进程,包括Java应用,它提供了进程守护、日志管理、负载均衡、重启策略等强大功能。

安装PM2:

npm install pm2 -g

启动Java应用:

pm2 start "java -Xmx512m -jar my-app.jar" --name "my-java-app"

常用PM2命令:

pm2 list              # 查看所有进程
pm2 logs my-java-app  # 查看日志
pm2 restart my-java-app # 重启应用
pm2 stop my-java-app    # 停止应用

2 使用Docker容器化部署

这是目前最主流的部署方式之一,将你的JAR包打包进一个轻量级的Docker镜像中,可以实现环境一致性、可移植性和易于扩展。

Dockerfile示例:

# 使用官方的OpenJDK 8镜像作为基础镜像
FROM openjdk:8-jre-alpine
# 将JAR包复制到容器内
COPY target/my-app-1.0.0.jar app.jar
# 声明容器监听的端口
EXPOSE 8080
# 设置JVM参数并启动应用
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建与运行:

# 构建镜像
docker build -t my-java-app .
# 运行容器
docker run -d -p 8080:8080 --name my-running-app my-java-app

java -jar命令看似简单,但其背后蕴含着Java应用打包、启动和部署的精髓,从基础的命令格式,到JVM参数的精细调优,再到后台运行和高级部署方案,每一步都值得我们去学习和掌握。

希望这篇“终极指南”能够成为你解决java -jar相关问题的“案头手册”,最好的学习方式是实践,现在就打开你的终端,动手尝试一下吧!


如果你觉得这篇文章对你有帮助,请别忘了点赞、收藏和分享!你的支持是我们持续创作高质量内容的最大动力!

分享:
扫描分享到社交APP
上一篇
下一篇