1. war包
记得刚毕业进入的第一家公司,当时使用的spring mvc + hibernate
,并打成war
包部署到服务器上。
前提是服务器上需要安装Tomcat
。
1.1 windows服务器
如果war
包部署到window
服务器上,双击startup.bat
即可启动tomcat
。
1.2 linux服务器
如果war
包部署到linux
服务器上,执行如下命令:
# 1. 首先进入到Tomcat的bin目录
cd ./tomcat/bin
# 2. 以下两种方式启动war包
(1) ./startup.sh
(2) sh startup.sh
war包的部署缺点:
-
你重启了服务器上的tomcat,在你关掉tomcat的一瞬间,这上面部署的所有项目都不能用。
-
如果你的项目启动失败,也会导致tomcat一直处于关机状态,别的项目就会一直无法访问。
war包的优点:
- war包部署的好处就是你一旦部署成功,如果你的代码有更改,只需要替换掉需要更改的代码,不需要再次部署。
离开这家公司进入新的公司后,使用的是spring boot + mybatis
框架,并打成jar
包部署到Linux
服务器上。
部署jar
包相对于war对其他项目的影响几乎为0,因为他只需要部署apach
,并重启apach
,因为他自身带有tomcat
,所以我们不需要额外部署tomcat
,但是我们需要运行jar包,这个项目才算运行起来。
我们可以使用以下几种方式运行jar包。
2. jar包
启动Linux服务器上的jar
包有两种方式:
-
java -jar xxx.jar
-
nohup java -jar xxx.jar
如下分析这两种启动方式:
2.1 java -jar
2.1.1 java -jar xxx.jar
表示在当前ssh窗口,可按CTRL + C
打断程序运行,或者直接关闭窗口,则程序直接退出。
2.1.2 java -jar xxx.jar &
表示在当窗口关闭时,程序才会中止运行。
&
代表让该命令在后台执行。
2.2 nohup java -jar
2.2.1 nohup java -jar XXX.jar &
表示不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。
注意,该作业的所有输出被重定向到nohup.out的文件中。
2.2.2 nohup java -jar xxx.jar > Log.log & 或者 nohup java -jar xxx.jar >> Log.log &
nohup java -jar xxx.jar > Log.log &
或者 nohup java -jar xxx.jar >> Log.log &
表示不挂断运行命令,当账户退出或终端关闭时,程序仍然运行,并且该作业的所有输出被重定向到Log.log
的文件中。
> Log.log
该命令就是指定日志输出的文件。
>> Log.log
表示将输出以追加的方式重定向到Log.log
中
【注意】:Log.log
与xxx.jar
同目录。
2.2.3 nohup java -jar xxx.jar > Log.log 2>&1 & 或者nohup java -jar xxx.jar >> Log.log 2>&1 &
> Log.log 2>&1
:表示将 stdout
和 stderr
合并后重定向到 Log.log
-
标准输入文件(
stdin
):stdin的文件描述符为0,Unix程序默认从stdin
读取数据。 -
标准输出文件(
stdout
):stdout 的文件描述符为1,Unix程序默认向stdout
输出数据。 -
标准错误文件(
stderr
):stderr的文件描述符为2,Unix程序会向stderr流
中写入错误信息。
2.2.4 nohup java -jar xxx.jar > /dev/null 2>&1 &
屏蔽输出,起到禁止输出作用。
/dev/null
是一个特殊的文件,写入到它的内容都会被丢弃;
如果尝试从该文件读取内容,那么什么也读不到。
但是 /dev/null
文件非常有用,将命令的输出重定向到它,会起到禁止输出
的效果。
2.2.5 nohup java -jar -XX:MetaspaceSize=1g -XX:MaxMetaspaceSize=1g -Xmx2048m -Xms2048m -Xmn256k test-*.jar >/dev/null &
-XX:MetaspaceSize=1g
:指Metaspace
扩容时触发FullGC
的初始化阈值,也是最小的阈值。
-Xmx10240m
:代表最大堆。
-Xms10240m
:代表最小堆。
-Xmn5120m
:代表新生代。
需要有以下几点明确XX:MetaspaceSize
:
-
无论
-XX:MetaspaceSize
配置什么值,Metaspace
的初始容量一定是21807104(约20.8m)
。 -
Metaspace
由于使用不断扩容到-XX:MetaspaceSize
参数指定的量,就会发生FGC( 从应用程序启动到当前,发生Full GC的次数)
;且之后每次Metaspace扩容都会发生FGC
。 -
如果
Old
区配置CMS
垃圾回收,那么第2点的FGC
也会使用CMS
算法进行回收。 -
Meta区容量范围为[20.8m, MaxMetaspaceSize)。
-
如果
MaxMetaspaceSize
设置太小,可能会导致频繁FGC
,甚至OOM
; -
建议
MetaspaceSize
和MaxMetaspaceSize
设置一样大。具体设置多大,建议稳定运行一段时间后通过jstat -gc pid
确认且这个值大一些,对于大部分项目256m
即可。
3. java -jar 和 nohup java -jar的比较
综合上述分析后,我们在实际开发中,经常使用nohup java -jar xxx.jar
启动jar包,如下代码所示:
nohup java -jar admin.jar > log.file 2>&1
而不太会使用 java -jar xxx.jar
启动jar包。