今天项目要求Nginx+jar包运行多个项目,在此记录一下部署的过程。其中借鉴了好多网上前辈的经验,感谢各位的无私分享!
一、SpringBoot项目使用mvn命令导出可运行jar包
这部分主要是Pom.xml文件的配置,而且主要是<build></build>部分的配置。
我的springboot版本是2.1.4
1、导出包含lib依赖包的可执行jar包
<build>
<plugins>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>${start-class}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<!--<appendAssemblyId>false</appendAssemblyId>-->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- 主程序入口类 -->
<mainClass>cn.zh.demo01.Demo01Application</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<!--<id>make-assembly</id>-->
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
导出这个包大小为27M,感觉如果多个项目都这样就太占空间了。所以才有了下面的瘦身。因为多个项目使用lib依赖包都差不多。
2、导出lib目录与jar包分离的可运行jar
<build>
<plugins>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖-->
<includes>
<include>
<groupId>null</groupId>
<artifactId>null</artifactId>
</include>
</includes>
<layout>ZIP</layout>
<!--使用外部配置文件,jar包里没有资源文件-->
<addResources>true</addResources>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar -->
<!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar -->
<!--<classifier>run</classifier>-->
</configuration>
</execution>
</executions>
</plugin>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<!--不打包资源文件-->
<!--<excludes>-->
<!--<exclude>*.**</exclude>-->
<!--<exclude>*/*.xml</exclude>-->
<!--</excludes>-->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!--MANIFEST.MF 中 Class-Path 加入前缀-->
<classpathPrefix>lib/</classpathPrefix>
<!-- 主程序入口类 -->
<mainClass>cn.zh.demo01.Demo01Application</mainClass>
</manifest>
<!--<manifestEntries>-->
<!--<!–MANIFEST.MF 中 Class-Path 加入资源文件目录–>-->
<!--<Class-Path>./resources/</Class-Path>-->
<!--</manifestEntries>-->
</archive>
</configuration>
</plugin>
<!--拷贝依赖 copy-dependencies-->
<!--也可以执行mvn copy-dependencies 命令打包依赖-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib/
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
导出后,lib文件目录就有26M,我的项目jar包只有几百K,不错!
二、部署及运行
运行命令:java -Dloader.path="lib/" -jar XXXX.jar
loader.path为lib目录的路径。
到此又看到springboot的启动图标了。。。
但一旦关闭SSH连接,服务就自动停止了。于是又上网搜,前辈指出:
nohup java -jar XXX.jar >log.out &;
nohup是保证ssh连接关闭后,jar任然运行的关键
& 相当于后台运行,你后面还可以输入命令
>log.out 是输出日志的地方
ps aux|grep XXX.jar 查看某jar包的运行的进程号
关闭问题解决,但启动会报: nohup: ignoring input and redirecting stderr to stdout
再搜,前辈又指出:
把后面的 “&” 改成 “2>&1 &”,于是把启动命令改成如下:
解释如下:
2>
表示把标准错误(stderr)重定向,标准输出(stdout)是1。
尖括号后面可以跟文件名,或者是&1, &2,分别表示重定向到标准输出和标准错误。
2> &1
1> &2
2> stderr.log
1> stdout.log
于是我的启动命令改为:
nohup java -Dloader.path="../lib/" -jar demo01-0.0.1-SNAPSHOT.jar >log.out 2>&1 &
完美解决。。。。
关于Nginx的代理配置,可以上网搜一下,很多前辈的分享,在此不多说了!