部署与运行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项目
2
在这个例子中,--server.port=8081
参数告诉 Spring Boot 将应用的端口设置为 8081。
或者使用,注意:
使用 -D
方式(适用于自定义配置读取),或者说它是使用 JVM 参数方式传递配置(非SpringBoot应用也可以使用)
java -Dserver.port=8090 -jar ${xxx.jar}
其中${xxx.jar}
为jar包名称,通过该种方式部署加上命令 -Dserver.port=8090,则即使jar所属项目配置的端口为8080,生效的端口仍为8090.
# 指定输出文件
# 输出内容到当前文件
java -jar xxx.jar >> app.log 2>&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 &
# 后台运行
# 常规用法
nohup java -jar xxx.jar >> app.log 2>&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
-Xms512m
:初始堆内存(最小内存)-Xmx1024m
:最大堆内存
该命令表示,应用启动时立即获得 512MB 堆内存,当应用需要更多内存时,堆内存最多可扩展到 1GB。
下面是内存工作示意图:
堆内存(Heap Memory)
┌──────────────────────────────┐
│ 最大 1GB │ <-- -Xmx1024m
│ │
│ 动态扩展区域 │
│ (512MB → 1GB 之间) │
├──────────────────────────────┤
│ 初始 512MB │ <-- -Xms512m
└──────────────────────────────┘
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
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>
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,加压后,就只是一些代码和字节码文件