tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 探索SpringBoot

  • 常用功能实现

  • Security认证授权

  • 扩展

  • 实战与注意事项

  • 其它

    • IDEA_SpringBoot搭建多模块项目
    • 解决IDEA创建SpringBoot项目没有Java8
    • 部署与运行jar包相关
      • jar和war的区别
        • 定义和用途
        • 文件结构和内容
        • 部署和使用环境
        • 使用场景和应用类型
        • 总结
      • 通过参数运行jar
        • 指定端口
        • 指定输出文件
        • 输出内容到当前文件
        • 指定端口+指定输出文件
        • 后台运行
        • 常规用法
        • 通过参数限定内存大小
        • 更复杂的参数
      • springboot的jar为何能直接运行
        • 普通的jar
    • 类命名的一些建议
  • 《SpringBoot》笔记
  • 其它
EffectTang
2024-11-06
目录

部署与运行jar包相关

# 部署与运行jar包相关

# jar和war的区别

# 定义和用途

JAR包 是一种通用的压缩格式,用于分发Java类文件和与之相关的元数据和资源。

WAR包 专用于Web应用程序,包含Servlet、JSP、HTML、JavaScript等网页相关文件。

# 文件结构和内容

JAR包 通常包含.class文件和应用程序库,以及配置文件如MANIFEST.MF。

WAR包 结构更为复杂,包括WEB-INF目录下的web.xml部署描述符、类文件、库文件等。

# 部署和使用环境

JAR包 可以在任何Java环境中使用,常见于桌面、服务器端应用。

WAR包 需要部署在支持Servlet和JSP的Web服务器或应用服务器上。

# 使用场景和应用类型

JAR包 适用于任何标准Java应用,如控制台应用、桌面应用或通用库。

WAR包 专为Web应用设计,适用于需要Web界面的项目。

# 总结

  • JAR 文件:适用于打包 Java 类库和独立的 Java 应用程序。
  • WAR 文件:适用于打包 Web 应用程序,部署在应用服务器上。

# 通过参数运行jar

# 指定端口

假设你的 JAR 包名为 app.jar,你可以使用以下命令来指定应用的运行端口,如: --server.port 参数来指定。

java -jar app.jar --server.port=8081
# 适用于SpringBoot项目
1
2

在这个例子中,--server.port=8081 参数告诉 Spring Boot 将应用的端口设置为 8081。

或者使用,注意:

使用 -D 方式(适用于自定义配置读取),或者说它是使用 JVM 参数方式传递配置(非SpringBoot应用也可以使用)

java -Dserver.port=8090 -jar ${xxx.jar}
1

其中${xxx.jar}为jar包名称,通过该种方式部署加上命令 -Dserver.port=8090,则即使jar所属项目配置的端口为8080,生效的端口仍为8090.

# 指定输出文件

# 输出内容到当前文件

java -jar xxx.jar >> app.log 2>&1
1

它的作用是启动一个 Java 应用,并将标准输出和错误输出都追加写入到,当前文件夹中的app.log 日志文件中。如果没有app.log就创建它。

以下是它各个部分的解释:

java -jar xxx.jar

  • 这是运行一个可执行的 JAR 包,比如一个 Spring Boot 应用。
  • -jar 表示后面跟的是 JAR 文件名。
  • xxx.jar 是你的应用程序打包后的可执行文件。

>> app.log

  • >> 表示追加输出(不会覆盖已有内容)。
  • app.log 是输出的目标文件。
  • 整体表示:把 Java 程序的标准输出(stdout)追加写入到 app.log 文件中。

如果要改为 覆盖模式,将 追加模式(>>) 改为 **覆盖模式(>)**即可。

2>&1

  • 在 Unix/Linux 中:
    • 1 表示标准输出(stdout)
    • 2 表示标准错误输出(stderr)
  • 2>&1 的意思是:把标准错误输出重定向到标准输出的位置,也就是让 stderr 和 stdout 输出到同一个地方(这里是 app.log)。

# 指定端口+指定输出文件

java -jar --server.port=9090 xxx.jar >> app.log 2>&1 &
1

# 后台运行

# 常规用法

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

是 在 Linux/Unix 系统中启动一个 Java 应用程序并将其放在后台运行,同时将所有输出记录到日志文件中 的经典写法。我们来逐部分详细解释它的含义。

之前的一些参数已经介绍过,这里介绍新的部分:nohup

nohup = No Hang Up(不挂断),意思是:

  • 即使你关闭终端或断开 SSH 连接,这个进程也不会被终止。
  • 默认会生成一个叫 nohup.out 的日志文件,除非你指定了其他输出文件(这里我们指定了 app.log)。

而最后的这个命令,&,它的意思是。但要注意windows平台,不支持该命令。

  • 把整个命令放到 后台运行。
  • 加上 & 后,你可以继续在当前终端做其他事情,而不必等待这个 Java 程序结束。

注意:nohup是linux平台上的用法,windows平台没有。

如果你在 Windows 上也需要实现类似 nohup 的功能(即:关闭终端后程序仍然运行),可以使用以下几种替代方案:

start /B java -jar myapp.jar > app.log 2>&1

  • /B 表示在后台运行。
  • 不会随着 CMD 窗口关闭而终止进程。
  • 但注意:如果用户注销或重启系统,进程会被终止。

注意:最后的 “ &”。

& 是 Linux/Unix 特有的后台运行符号,Windows 原生不支持。

# 通过参数限定内存大小

在Spring Boot项目部署时,常常会指定JVM内存大小,

因为,合理配置内存参数(如初始内存 -Xms 和最大内存 -Xmx)是确保应用稳定性和性能的关键。

java -Xms512m -Xmx1024m -jar your-app.jar
1
  • -Xms512m:初始堆内存(最小内存)
  • -Xmx1024m:最大堆内存

该命令表示,应用启动时立即获得 512MB 堆内存,当应用需要更多内存时,堆内存最多可扩展到 1GB。

下面是内存工作示意图:

堆内存(Heap Memory)
┌──────────────────────────────┐
│          最大 1GB            │  <-- -Xmx1024m
│                              │
│        动态扩展区域           │
│  (512MB → 1GB 之间)          │
├──────────────────────────────┤
│        初始 512MB            │  <-- -Xms512m
└──────────────────────────────┘
1
2
3
4
5
6
7
8
9

注意:

内存扩展开销

  • 当实际内存使用超过 -Xms 的 512MB 时,JVM 会逐步扩展堆内存直到 -Xmx 的 1GB
  • 性能影响:内存扩展过程会导致短暂停顿(GC 暂停),影响响应时间

生产环境建议

推荐将 -Xms 和 -Xmx 设为相同值以避免动态扩展的开销:

java -Xms1024m -Xmx1024m -jar your-app.jar

# 更复杂的参数

java -Xms1g -Xmx1g \                 # 堆内存固定1GB
     -XX:MaxMetaspaceSize=256m \      # 限制元空间
     -XX:+HeapDumpOnOutOfMemoryError \ # OOM时生成dump
     -XX:HeapDumpPath=/opt/dumps/ \   # dump保存路径
     -jar your-app.jar
1
2
3
4
5

注意在内存单位的选择上,有一些注意事项:

  • m 表示 MB(-Xmx1024m)
  • g 表示 GB(-Xmx2g = 2048MB)
  • 单位错误示例:-Xmx1024(缺少单位,JVM 会使用默认单位 KB,仅 1MB!)

# springboot的jar为何能直接运行

如果我们要把Spring Boot (Spring Boot)应用打包成一个可运行的Jar (Jar)包,需要依赖官方提供的一个spring-boot-maven-plugin的插件。

如果,我们去掉spring-boot-maven-plugin插件,通过 mvn clean package 再打一次包。

打包依然会成功,包名也一样,但这时候你会发现,jar包的大小有着天壤之别,你会发现它很小(比如:只有3KB,之前的有17.7MB)。此外,我们通过java -jar 包名看能否启动成功,结果你会发现根本启动不了。

下列是对应的pom坐标

<build>
   <plugins>
       <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
       	   <version>2.7.12</version>
       </plugin>
   </plugins>
</build>
1
2
3
4
5
6
7
8
9

下面是主要的实现步骤:

1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。

2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的类

3.java -jar会去找jar中的manifest文件,在那里面找到真正的启动类;

4.Fat jar的启动Main函数是JarLauncher,它负责创建一个LaunchedURLClassLoader来加载bootib下面的jar,并以一个新线程启动应用的Main函数。

# 普通的jar

普通的jar,加压后,就只是一些代码和字节码文件

上次更新: 2025/06/08, 15:06:25
解决IDEA创建SpringBoot项目没有Java8
类命名的一些建议

← 解决IDEA创建SpringBoot项目没有Java8 类命名的一些建议→

最近更新
01
springboot中发送http
06-17
02
集成Redis及注意事项
06-08
03
Vue项目发布
06-04
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式