- 在spring boot項目中使用maven profiles和maven assembly插件根據不一樣環境打包成tar.gz或者zip
- 將spring boot項目中的配置文件提取到外部config目錄中
- 將spring boot項目中的啓動jar包移動到boot目錄中
- 將spring boot項目中的第三方依賴jar包移動到外部lib目錄中
- bin目錄中是啓動,中止,重啓服務命令
- 打包後的目錄結構相似於tomcat/maven目錄結構
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <configuration> <descriptors> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
<?xml version="1.0" encoding="UTF-8"?> <assembly> <!-- 可自定義,這裏指定的是項目環境 --> <!-- spring-boot-assembly-local-1.0.RELEASE.tar.gz --> <id>${profileActive}-${project.version}</id> <!-- 打包的類型,若是有N個,將會打N個類型的包 --> <formats> <format>tar.gz</format> <!--<format>zip</format>--> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <!-- 0755->即用戶具備讀/寫/執行權限,組用戶和其它用戶具備讀寫權限; 0644->即用戶具備讀寫權限,組用戶和其它用戶具備只讀權限; --> <!-- 將src/bin目錄下的全部文件輸出到打包後的bin目錄中 --> <fileSet> <directory>${basedir}/src/bin</directory> <outputDirectory>bin</outputDirectory> <fileMode>0755</fileMode> <includes> <include>**.sh</include> <include>**.bat</include> </includes> </fileSet> <!-- 指定輸出target/classes中的配置文件到config目錄中 --> <fileSet> <directory>${basedir}/target/classes</directory> <outputDirectory>config</outputDirectory> <fileMode>0644</fileMode> <includes> <include>application.yml</include> <include>application-${profileActive}.yml</include> <include>mapper/**/*.xml</include> <include>static/**</include> <include>templates/**</include> <include>*.xml</include> <include>*.properties</include> </includes> </fileSet> <!-- 將第三方依賴打包到lib目錄中 --> <fileSet> <directory>${basedir}/target/lib</directory> <outputDirectory>lib</outputDirectory> <fileMode>0755</fileMode> </fileSet> <!-- 將項目啓動jar打包到boot目錄中 --> <fileSet> <directory>${basedir}/target</directory> <outputDirectory>boot</outputDirectory> <fileMode>0755</fileMode> <includes> <include>${project.build.finalName}.jar</include> </includes> </fileSet> <!-- 包含根目錄下的文件 --> <fileSet> <directory>${basedir}</directory> <includes> <include>NOTICE</include> <include>LICENSE</include> <include>*.md</include> </includes> </fileSet> </fileSets> </assembly>
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layout>ZIP</layout> <includes> <!-- 項目啓動jar包中排除依賴包 --> <include> <groupId>non-exists</groupId> <artifactId>non-exists</artifactId> </include> </includes> </configuration> </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <!-- 項目啓動類 --> <mainClass>Application</mainClass> <!-- 依賴的jar的目錄前綴 --> <classpathPrefix>../lib</classpathPrefix> <addClasspath>true</addClasspath> </manifest> </archive> <includes> <!-- 只打包指定目錄的文件 --> <include>io/geekidea/springboot/**</include> </includes> </configuration> </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>target/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> <includeScope>compile</includeScope> </configuration> </execution> </executions> </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.1.0</version> </plugin> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>application.yml</include> <include>application-${profileActive}.yml</include> <include>mapper/**/*.xml</include> <include>static/**</include> <include>templates/**</include> <include>*.xml</include> <include>*.properties</include> </includes> </resource>
<!--MAVEN打包選擇運行環境--> <!-- 1:local(默認) 本地 2:dev:開發環境 3:test 4:uat 用戶驗收測試 5.pro:生產環境--> <profiles> <profile> <id>local</id> <properties> <profileActive>local</profileActive> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>dev</id> <properties> <profileActive>dev</profileActive> </properties> <activation> <activeByDefault>false</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <profileActive>test</profileActive> </properties> <activation> <activeByDefault>false</activeByDefault> </activation> </profile> <profile> <id>uat</id> <properties> <profileActive>uat</profileActive> </properties> <activation> <activeByDefault>false</activeByDefault> </activation> </profile> <profile> <id>prod</id> <properties> <profileActive>prod</profileActive> </properties> <activation> <activeByDefault>false</activeByDefault> </activation> </profile> </profiles>
<repositories> <!--阿里雲倉庫--> <repository> <id>aliyun</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories>
├─bin │ restart.sh │ shutdown.sh │ startup.bat │ startup.sh │ ├─logs │ springboot-assembly.log │ ├─main │ ├─assembly │ │ assembly.xml │ │ │ ├─java │ │ └─io │ │ └─geekidea │ │ └─springboot │ │ └─assembly │ │ Application.java │ │ HelloController.java │ │ HelloService.java │ │ HelloServiceImpl.java │ │ │ └─resources │ │ application-dev.yml │ │ application-local.yml │ │ application-prod.yml │ │ application-test.yml │ │ application-uat.yml │ │ application.yml │ │ │ ├─mapper │ │ │ test.xml │ │ │ │ │ └─hello │ │ hello.xml │ │ │ ├─static │ │ index.html │ │ │ └─templates │ test.txt │ └─test
mvn clean package
spring-boot-assembly-local-1.0.RELEASE.tar.gz
tar -zxvf spring-boot-assembly-local-1.0.RELEASE.tar.gz
└─spring-boot-assembly │ LICENSE │ NOTICE │ README.md │ ├─bin │ restart.sh │ shutdown.sh │ startup.bat │ startup.sh │ ├─boot │ spring-boot-assembly.jar │ ├─config │ │ application-local.yml │ │ application.yml │ │ │ ├─mapper │ │ │ test.xml │ │ │ │ │ └─hello │ │ hello.xml │ │ │ ├─static │ │ index.html │ │ │ └─templates │ test.txt │ └─lib classmate-1.4.0.jar fastjson-1.2.54.jar hibernate-validator-6.0.13.Final.jar jackson-annotations-2.9.0.jar jackson-core-2.9.7.jar jackson-databind-2.9.7.jar jackson-datatype-jdk8-2.9.7.jar jackson-datatype-jsr310-2.9.7.jar jackson-module-parameter-names-2.9.7.jar javax.annotation-api-1.3.2.jar jboss-logging-3.3.2.Final.jar jul-to-slf4j-1.7.25.jar log4j-api-2.11.1.jar log4j-to-slf4j-2.11.1.jar logback-classic-1.2.3.jar logback-core-1.2.3.jar slf4j-api-1.7.25.jar snakeyaml-1.23.jar spring-aop-5.1.2.RELEASE.jar spring-beans-5.1.2.RELEASE.jar spring-boot-2.1.0.RELEASE.jar spring-boot-autoconfigure-2.1.0.RELEASE.jar spring-boot-starter-2.1.0.RELEASE.jar spring-boot-starter-json-2.1.0.RELEASE.jar spring-boot-starter-logging-2.1.0.RELEASE.jar spring-boot-starter-tomcat-2.1.0.RELEASE.jar spring-boot-starter-web-2.1.0.RELEASE.jar spring-context-5.1.2.RELEASE.jar spring-core-5.1.2.RELEASE.jar spring-expression-5.1.2.RELEASE.jar spring-jcl-5.1.2.RELEASE.jar spring-web-5.1.2.RELEASE.jar spring-webmvc-5.1.2.RELEASE.jar tomcat-embed-core-9.0.12.jar tomcat-embed-el-9.0.12.jar tomcat-embed-websocket-9.0.12.jar validation-api-2.0.1.Final.jar
bin/startup.bat
- 訪問地址: http://localhost:8100/example/hello?name=123
- 響應結果:
{"msg":"service hello:123","code":200}
sh bin/startup.sh 啓動項目 sh bin/shutdown.sh 中止服務 sh bin/restart.sh 重啓服務
APPLICATION="spring-boot-assembly" APPLICATION_JAR="${APPLICATION}.jar"
JAVA_OPTION配置java
- JVM Configuration
- -Xmx256m:設置JVM最大可用內存爲256m,根據項目實際狀況而定,建議最小和最大設置成同樣。
- -Xms256m:設置JVM初始內存。此值能夠設置與-Xmx相同,以免每次垃圾回收完成後JVM從新分配內存
- -Xmn512m:設置年輕代大小爲512m。整個JVM內存大小=年輕代大小 + 年老代大小 + 持久代大小。持久代通常固定大小爲64m,因此增大年輕代,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8
- -XX:MetaspaceSize=64m:存儲class的內存大小,該值越大觸發Metaspace GC的時機就越晚
- -XX:MaxMetaspaceSize=320m:限制Metaspace增加的上限,防止由於某些狀況致使Metaspace無限的使用本地內存,影響到其餘程序
- -XX:-OmitStackTraceInFastThrow:解決重複異常不打印堆棧信息問題
JAVA_OPT="-server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m" JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
nohup java ${JAVA_OPT} -jar ${BASE_PATH}/boot/${APPLICATION_JAR} --spring.config.location=${CONFIG_DIR} > ${LOG_PATH} 2>&1 &
nohup java -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow -jar /opt/spring-boot-assembly/boot/spring-boot-assembly.jar --spring.config.location=/opt/spring-boot-assembly/config/ > /opt/spring-boot-assembly/logs/spring-boot-assembly.log 2>&1 &
- nohup:在後臺運行jar包,而後將運行日誌輸出到指定位置
- -server:指定JVM參數
- -jar /opt/spring-boot-assembly/boot/spring-boot-assembly.jar:指定啓動的jar包
- 啓動命令中指定的啓動jar包路徑,配置文件路徑,日誌路徑都是絕對路徑
- 可在任何位置執行start.sh,shutdown.sh,restart.sh腳本
- --spring.config.location:指定配置文件目錄或者文件名稱,若是是目錄,以/結束
- > /opt/spring-boot-assembly/logs/spring-boot-assembly.log:指定日誌輸出路徑
- 2>&1 & :將正常的運行日誌和錯誤日誌合併輸入到指定日誌,並在後臺運行
PID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }') kill -9 ${PID}
logs/spring-boot-assembly_startup.log
================================================ 2018-12-12 12:36:56 ================================================ application name: spring-boot-assembly application jar name: spring-boot-assembly.jar application bin path: /opt/spring-boot-assembly/bin application root path: /opt/spring-boot-assembly application log path: /opt/spring-boot-assembly/logs/spring-boot-assembly.log application JAVA_OPT : -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow application background startup command: nohup java -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow -jar /opt/spring-boot-assembly/boot/spring-boot-assembly.jar --spring.config.location=/opt/spring-boot-assembly/config/ > /opt/spring-boot-assembly/logs/spring-boot-assembly.log 2>&1 & application pid: 11596
logs/spring-boot-assembly.log
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.0.RELEASE) 2018-12-12 23:28:58.420 INFO 11596 --- [ main] o.s.boot.SpringApplication : Starting application on VM_0_17_centos with PID 11596 (started by root in /opt/spring-boot-assembly) 2018-12-12 23:28:58.442 INFO 11596 --- [ main] o.s.boot.SpringApplication : The following profiles are active: local 2018-12-12 23:29:01.355 INFO 11596 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8100 (http) 2018-12-12 23:29:01.437 INFO 11596 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2018-12-12 23:29:01.437 INFO 11596 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/9.0.12 2018-12-12 23:29:01.461 INFO 11596 --- [ main] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib] 2018-12-12 23:29:01.646 INFO 11596 --- [ main] o.a.c.c.C.[.[localhost].[/example] : Initializing Spring embedded WebApplicationContext 2018-12-12 23:29:01.647 INFO 11596 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3028 ms 2018-12-12 23:29:01.708 INFO 11596 --- [ main] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2018-12-12 23:29:01.712 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2018-12-12 23:29:01.712 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2018-12-12 23:29:01.712 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*] 2018-12-12 23:29:01.713 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2018-12-12 23:29:02.250 INFO 11596 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2018-12-12 23:29:03.179 INFO 11596 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8100 (http) with context path '/example' 2018-12-12 23:29:03.182 INFO 11596 --- [ main] o.s.boot.SpringApplication : Started application in 5.844 seconds (JVM running for 6.547) spring.profiles.active = local contextPath = /example server.port = 8100 hello = Hello Local http://localhost:8100/example/hello?name=123
`-- logs |-- back | |-- spring-boot-assembly_back_2018-12-12-23-30-10.log | `-- spring-boot-assembly_back_2018-12-12-23-36-56.log |-- spring-boot-assembly.log `-- spring-boot-assembly_startup.log