1. 程式人生 > >Springboot應用部署實踐

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包是很少會變動

的,而且這部分檔案也比較大,所以我們最好是可以將可執行的jar包和這些依賴jar包分開;另外,對於一些靜態的配置檔案,如.proterties,.xml,*.yml等檔案,有的時候需要在不重新發布的情況下進行修改,這樣,我們也可以將這些配置檔案也和可執行jar檔案分開。於是我們可以將最終打出來的包分為三個部分:可執行jar檔案;依賴jar包檔案;配置檔案,我們將依賴jar包放入lib資料夾下面,配置檔案放入config資料夾下面,最後將這三部分檔案打成一個zip包,然後放到對應伺服器上解壓後執行,下面我們來看看具體配置。

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資料夾。
       最終目錄結構如下圖所示:

       zip包檔案

 

四,應用無限重啟問題

       由於Springboot應用可以開啟熱部署功能,當發現classpath目錄下面檔案有變更的時候就會自動重新啟動應用,而我們應用日誌檔案正好是在classpath的logs目錄下面的,所以發現日誌檔案有變化也會重新啟動,因此才會出現無限重啟現象。解決辦法有兩種:

    • 1.將日誌的目錄移除classpath路徑下。
    • 2.在springboot配置檔案中的熱部署配置中排除檢測目錄。
      第二種方式具體配置如下:
1 spring:
2 devtools:
3   restart:
4     enabled: true
5     additional-exclude: logs/**