springboot工程打包与部署(Linux下)
本文介绍springboot工程在Linux下,打包、部署、日志配置、shell脚本自启动等一系列操作。
1、springboot工程打包
使用springboot自带的Run/Debug Configurations:
新建一个Maven Configuration:
把以下命令copy到Run中:
clean package spring-boot:repackage -Dmaven.test.skip=true
执行配置好的打包命令:
target下即为打好的jar包:
如果打包有问题,可参考以下文件:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <packaging>jar</packaging> <groupId>com.tx</groupId> <artifactId>lwy-new</artifactId> <version>0.0.1-SNAPSHOT</version> <name>lwy-new</name> <description>lwy-new</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hive.jdbc</groupId> <artifactId>hive-jdbc</artifactId> <version>2.2.0-TBDS-5.2.0.1</version> <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/lib/hive-jdbc-2.2.0-TBDS-5.2.0.1.jar</systemPath> </dependency> <dependency> <groupId>org.apache.hive.service</groupId> <artifactId>hive-service-rpc</artifactId> <version>2.2.0-TBDS-5.2.0.1</version> <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/lib/hive-service-rpc-2.2.0-TBDS-5.2.0.1.jar</systemPath> </dependency> <dependency> <groupId>org.apache.hive.common</groupId> <artifactId>hive-common</artifactId> <version>2.2.0-TBDS-5.2.0.1</version> <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/lib/hive-common-2.2.0-TBDS-5.2.0.1.jar</systemPath> </dependency> <dependency> <groupId>org.apache.hive.serde</groupId> <artifactId>hive-serde</artifactId> <version>2.2.0-TBDS-5.2.0.1</version> <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/lib/hive-serde-2.2.0-TBDS-5.2.0.1.jar</systemPath> </dependency> <dependency> <groupId>org.apache.hive.service</groupId> <artifactId>hive-service</artifactId> <version>2.2.0-TBDS-5.2.0.1</version> <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/lib/hive-service-2.2.0-TBDS-5.2.0.1.jar</systemPath> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.2-TBDS-5.2.0.1</version> <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/lib/hadoop-common-2.7.2-TBDS-5.2.0.1.jar</systemPath> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.14</version> </dependency> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.17.0</version> <type>jar</type> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.0-android</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.2.RELEASE</version> <configuration> <mainClass>com.tx.lwynew.LwyNewApplication</mainClass> <fork>true</fork> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/webapp</directory> </resource> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> </resource> <resource> <directory>lib</directory> <targetPath>BOOT-INF/lib/</targetPath> <includes> <include>**/*.jar</include> </includes> </resource> </resources> </build> </project>
特殊情况:本地jar的打包
本工程引入了本地jar包,这种情况打包具体操作如下:
1、修改 spring-boot-starter-parent的版本为:2.7.5 (4.0.0版本的打包将会失败)
引用的本地jar:
2、日志配置
在工程的resources路径下,添加 logback.xml.
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"> <contextName>lwy-new</contextName> <!-- 彩色日志依赖的渲染类 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 控制台彩色日志格式 --> <property name="CONSOLE_LOG_PATTERN" value="%black(%contextName-) ${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){red} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){cyan} %clr(%-40.40logger{39}){magenta} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- 日志文件输出 --> <property name="FILE_LOG_PATTERN" value="%black(%contextName-) ${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- 日志文件地址 --> <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-./logs}}"/> <!-- 日志文件前缀 --> <property name="LOG_PREFIX" value="lwy"/> <!-- 控制台输出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_FILE}/${LOG_PREFIX}-info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 是否在启动时清除存档日志文件 --> <cleanHistoryOnStart>${LOG_FILE_CLEAN_HISTORY_ON_START:-false} </cleanHistoryOnStart> <!-- 过渡日志文件名的模式 --> <fileNamePattern> ${ROLLING_FILE_NAME_PATTERN:-${LOG_FILE}/${LOG_PREFIX}-info-%d{yyyyMMdd}.log.%i.gz} </fileNamePattern> <!-- 单个日志文件最多 100MB, 30天的日志周期,最大不能超过20GB --> <maxFileSize>${LOG_FILE_MAX_SIZE:-100MB}</maxFileSize> <maxHistory>${LOG_FILE_MAX_HISTORY:-30}</maxHistory> <totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-20GB}</totalSizeCap> </rollingPolicy> </appender> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_FILE}/${LOG_PREFIX}-error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 是否在启动时清除存档日志文件 --> <cleanHistoryOnStart>${LOG_FILE_CLEAN_HISTORY_ON_START:-false} </cleanHistoryOnStart> <!-- 过渡日志文件名的模式 --> <fileNamePattern> ${ROLLING_FILE_NAME_PATTERN:-${LOG_FILE}/${LOG_PREFIX}-error-%d{yyyyMMdd}.log.%i.gz} </fileNamePattern> <!-- 单个日志文件最多 100MB, 30天的日志周期,最大不能超过20GB --> <maxFileSize>${LOG_FILE_MAX_SIZE:-100MB}</maxFileSize> <maxHistory>${LOG_FILE_MAX_HISTORY:-30}</maxHistory> <totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-20GB}</totalSizeCap> </rollingPolicy> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> <logger name="net.sf.ehcache" level="INFO"/> <!-- 减少部分debug日志 --> <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/> <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/> <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/> <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/> <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/> <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/> <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/> <!-- 业务日志 --> <Logger name="com.tx" level="INFO"/> </configuration>
在配置文件application.yaml添加如下配置:
logging:
level:
com.tx.*: debug
服务器上日志文件存储的情况:
3、部署
本程序部署在Linux上,需要在Linux创建文件夹,如下图:
将打好的jar包和启动jar的shell脚本copy到上一步新建的路径下:
执行以下命令部署jar:
sh start.sh
实时查看log日志信息,执行以下命令:
tail -f /xxx/xxx/xx.log
查询日志效果如下:
4、shell脚本
编写shell脚本一键启动应用:
#!/bin/sh #export JAVA_HOME=/usr/java/jdk1.8 #export PATH=$JAVA_HOME/bin:$PATH APP_NAME=/usr/lwy/lwy-new-0.0.1-SNAPSHOT.jar LOG_FILE=/usr/lwy/logs/lwy-info.log #pid=`ps -ef | grep "java -jar opc-0.0.1-SNAPSHOT.jar" | grep -v grep | awk '{print $2}'` # 查找已经启动的jar的进程id pid=`jps |grep lwy-new-0.0.1-SNAPSHOT.jar |awk '{print $1}'` # 杀死进程 echo "进程pid是 $pid" $pid kill -9 $pid echo "$pid进程终止成功" #判断jar包文件是否存在,如果存在启动jar包,并实时查看日志 if test -e $APP_NAME then echo '开始启动程序......' #启动jar包 nohup java -jar $APP_NAME --server.port=8889 1>/dev/null 2>&1 & #实时查看日志 #tail -f $LOG_FILE else echo "程序启动失败,$APP_NAME不存在" fi
shell脚本自启动:待续
5、实时查看日志
在Linux中执行以下命令:
tail -f /usr/lwy/xxxx/lwy-info.log