Springboot應用部署實踐
一,前言
SpringBoot應用常規部署方式是將其打成一個可執行jar包,使其能夠通過java -jar xxx.jar命令方式進行啟動,因此需要使用Maven等工具進行打包。
二,Maven打包
Springboot應用最簡單打包方式:在pom.xml檔案中新增相應的打包外掛,具體程式碼如下:
1 <build> 2 <plugins> 3 <plugin> 4 <groupId>org.springframework.boot</groupId> 5 <artifactId>spring-boot-maven-plugin</artifactId> 6 <configuration> 7 <fork>true</fork> 8 </configuration> 9 </plugin> 10 </plugins> 11 </build>
這樣打包出來的jar檔案比較大,包含了依賴包,以及配置檔案等等,然而在實際使用過程中,我們發現那些依賴的jar包是很少會變動
1.指定java編譯外掛
1 <plugin> 2<groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-compiler-plugin</artifactId> 4 <configuration> 5 <source>1.8</source> 6 <target>1.8</target> 7 <encoding>UTF-8</encoding> 8 </configuration> 9 </plugin>
指定java版本以及編碼格式。
2.可執行jar檔案打包
1 <plugin> 2 <groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-jar-plugin</artifactId> 4 <configuration> 5 <archive> 6 <manifest> 7 <addClasspath>true</addClasspath> 8 <classpathPrefix>lib</classpathPrefix> 9 <!-- 程式啟動入口 --> 10 <mainClass>com.wf.blog.Application</mainClass> 11 </manifest> 12 <manifestEntries> 13 <Class-Path>./</Class-Path> 14 </manifestEntries> 15 </archive> 16 </configuration> 17 <executions> 18 <execution> 19 <phase>prepare-package</phase> 20 <goals> 21 <goal>jar</goal> 22 </goals> 23 <configuration> 24 <excludes> 25 <exclude>mybatisGenerator/**</exclude> 26 <exclude>config/**</exclude> 27 <exclude>*.properties</exclude> 28 </excludes> 29 </configuration> 30 </execution> 31 </executions> 32 </plugin>
這裡需要指定程式啟動入口類,<Class-Path>./</Class-Path>
表示將jar檔案所在目錄設定成claspath路徑;在進行可執行jar檔案打包的時候需要將一些不需要的檔案排除在外,如一些和執行無關的,以及一些分離的配置,通過<excludes>
進行處理,這樣打出來的jar包就只包含本應用的基本內容,class檔案以及一些必須打進jar包的配置檔案。
三,assembly外掛打包
最後需要將配置檔案依賴jar包以及上面打出來的可執行jar檔案一起打包成zip檔案,這裡需要使用到maven的assembly外掛,新建src/main/build資料夾,並新建一個package.xml檔案,具體打包實現在這個檔案裡面做的,在pom.xml檔案我們需要將其指定到此檔案:
1 <plugin> 2 <artifactId>maven-assembly-plugin</artifactId> 3 <configuration> 4 <!-- not append assembly id in release file name --> 5 <appendAssemblyId>false</appendAssemblyId> 6 <descriptors> 7 <!-- 注意這裡的路徑 --> 8 <descriptor>src/main/build/package.xml</descriptor> 9 </descriptors> 10 </configuration> 11 <executions> 12 <execution> 13 <id>make-assembly</id> 14 <phase>package</phase> 15 <goals> 16 <goal>single</goal> 17 </goals> 18 </execution> 19 </executions> 20 </plugin>
package.xml具體實現如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> 4 <id>package</id> 5 <formats> 6 <format>zip</format> 7 </formats> 8 <!-- 改為false不會出現兩層相同的目錄 --> 9 <includeBaseDirectory>false</includeBaseDirectory> 10 <fileSets> 11 <fileSet> 12 <directory>target/classes</directory> 13 <outputDirectory>config</outputDirectory> 14 <includes> 15 <include>*.properties</include> 16 </includes> 17 <excludes> 18 <exclude>mybatisGenerator/**</exclude> 19 </excludes> 20 <fileMode>0640</fileMode> 21 </fileSet> 22 <fileSet> 23 <directory>target/classes/config</directory> 24 <outputDirectory>config</outputDirectory> 25 <includes> 26 <include>*.properties</include> 27 <include>*.xml</include> 28 <include>*.yml</include> 29 </includes> 30 <fileMode>0640</fileMode> 31 </fileSet> 32 <fileSet> 33 <directory>${project.build.directory}</directory> 34 <outputDirectory>${file.separator}</outputDirectory> 35 <includes> 36 <include>*.jar</include> 37 </includes> 38 </fileSet> 39 </fileSets> 40 <dependencySets> 41 <dependencySet> 42 <outputDirectory>lib</outputDirectory> 43 <scope>runtime</scope> 44 <!--<unpack>false</unpack> --> 45 <excludes> 46 <!--<exclude>${project.name}-${project.version}</exclude> --> 47 <exclude>${groupId}:${artifactId}</exclude> 48 </excludes> 49 </dependencySet> 50 </dependencySets> 51 </assembly>
可以看到將target/classes中的檔案進行了區分處理,對明確需要和執行jar檔案分開的都放入到config資料夾,另外,依賴包也放入了lib資料夾。
最終目錄結構如下圖所示:
四,應用無限重啟問題
由於Springboot應用可以開啟熱部署功能,當發現classpath目錄下面檔案有變更的時候就會自動重新啟動應用,而我們應用日誌檔案正好是在classpath的logs目錄下面的,所以發現日誌檔案有變化也會重新啟動,因此才會出現無限重啟現象。解決辦法有兩種:
- 1.將日誌的目錄移除classpath路徑下。
- 2.在springboot配置檔案中的熱部署配置中排除檢測目錄。
第二種方式具體配置如下:
1 spring: 2 devtools: 3 restart: 4 enabled: true 5 additional-exclude: logs/**