springboot項目實現jar包外配置文件管理


背景

為實現快速搭建和開發,項目以Springboot框架搭建,springboot搭建的項目可以將項目直接打成jar包並運行,無需自己安裝配置Tomcat或者其他服務器,是一種方便快捷的部署方式。

假設項目以最常規的方式打包成一個整體的jar包部署,即配置文件和第三方依賴包都包含在jar包里,就會有如下兩個問題

問題一:項目運行過程中,要改動配置文件的話需要重新打包並部署。

問題二:多個第三方依賴包都相近的項目要部署在同一台服務器時,各自的jar包都包含了相同的第三方依賴包(假設項目jar包有100M,第三方依賴包可能就占用了99M),這樣第三方依賴包冗余造成了服務器資源的浪費以及降低了項目部署的效率。

如果將各項目的配置文件、第三方依賴包都提取到jar包外統一管理,這樣即提升了項目打包效率又節約了服務器的磁盤消耗,同時項目的運維也是非常方便的,改動了配置文件重啟下服務就可以了,無需重新構建部署。

下面是具體的實現方案

1. 配置文件統一管理

1.1 springboot核心配置文件

Springboot讀取核心配置文件(application.properties)的優先級為

Jar包同級目錄的config目錄

Jar包同級目錄

classPath(即resources目錄)的config目錄

classpath目錄

上面是springboot默認去拿自己的核心配置文件的優先級,還有一種最高優先級的方式是項目啟動時通過命令的方式指定項目加載核心配置文件,命令如下

java –jar -Dspring.config.location=xxx/xxx/xxxx.properties xxxx.jar


如果Spring Boot在優先級更高的位置找到了配置,那么它會無視優先級更低的配置



1.2 其他資源配置文件

上面描述的Springboot核心文件已經能夠提取出jar包外進行管理了,但是還有其他一些業務上的配置文件,如數據源配置文件,公共資源定義配置文件(常量,FTP信息等),quartz定時器,日志等配置文件我們如何去提取出來並確保能在代碼中引用到呢

我們知道Springboot項目可以通過注解方式來獲取相關配置文件,所以我們也是通過注解方式讓項目能夠引用到jar包外部的配置文件的,如下圖:



@PropertySource里面的value有兩個值,第一個是classpath下config目錄下的數據源配置文件,第二個則是根據spring.profiles.path動態獲取的目錄,spring.profiles.path是我們在核心文件自定義的一個配置項,它的值是我們配置文件統一管理的文件夾路徑,后面的ignoreResourceNotFound=true則是設定假如根據前面一個路徑沒有找到相關配置文件,則根據第二個路徑去找。

我們還可以直接根據路徑,用FileSystemResource類去加載一個配置文件實例出來,如下圖



原理類似,根據在核心文件自定義的統一配置目錄的路徑來加載配置文件

另外logback日志配置文件加載方式如下:





綜上所述,我們梳理一下實現方案的思路

1、        在springboot核心文件里定義一個spring.profiles.path配置項,它的值指向我們所有配置文件統一放置的目錄,包含核心文件自身也是放置在里面的

2、        代碼或者配置文件里加載配置文件的地方也應該獲取spring.profiles.path配置項來動態加載該路徑下的配置文件

3、        Pom.xml文件修改打包相關模塊,將配置文件排除,這樣我們打出的jar包是不含配置文件的,打包配置請參考文檔節點3

4、        啟動jar包時,通過命令指定加載的核心文件為spring.profiles.path下的核心文件

2. 第三方依賴包統一管理

通常第三方jar包可以打進jar包里,也可以放在項目jar包同級目錄下的lib目錄,我們可以根據修改pom.xml打包配置來實現,請參考文檔節點3打包配置


3. 打包配置



<build>
                <resources>
                        <resource>
                                <directory>src/main/java</directory>
                                <includes>
                                        <include>**/*.properties</include>
                                        <include>**/*.xml</include>
                                </includes>
                                <filtering>true</filtering>
                        </resource>
                        <resource>
                                <directory>src/main/resources</directory>
                                <!—打包時排除配置文件-->
                                <excludes>
                                        <exclude>**/*.properties</exclude>
                                        <exclude>**/*.xml</exclude>
                                        <exclude>**/*.yml</exclude>
                                </excludes>
                                <filtering>false</filtering>
                        </resource>
                </resources>
                <plugins>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <configuration>
                                        <source>1.8</source>
                                        <target>1.8</target>
                                        <fork>true</fork>
                                        <skip>true</skip>
                                        <executable>
                                                C:/Program Files/Java/jdk1.8.0_161/bin/javac.exe
                                        </executable>
                                </configuration>
                        </plugin>
                        <plugin>
                                <artifactId>maven-jar-plugin</artifactId>
                                <configuration>
                                        <archive>
                                                <manifest>
                                                        <addClasspath>true</addClasspath>
                                                        <classpathPrefix>lib/</classpathPrefix>
                                                        <useUniqueVersions>false</useUniqueVersions>
                                                        <mainClass>com.xrq.demo.Application</mainClass>
                                                </manifest>
                                                <manifestEntries>
                                                        <Class-Path>./</Class-Path>
                                                </manifestEntries>
                                        </archive>
                                        <excludes>
                                                <exclude>*.properties</exclude>
                                                <exclude>*.yml</exclude>
                                                <exclude>*.xml</exclude>
                                                <exclude>config/**</exclude>
                                        </excludes>
                                </configuration>
                        </plugin>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-dependency-plugin</artifactId>
                                <executions>
                                        <execution>
                                                <id>copy</id>
                                                <phase>package</phase>
                                                <goals>
                                                        <goal>copy-dependencies</goal>
                                                </goals>
                                                <configuration>
                                                        <outputDirectory>
                                                                ${project.build.directory}/lib
                                                        </outputDirectory>
                                                </configuration>
                                        </execution>
                                </executions>
                        </plugin>
                </plugins>
        </build>

改好pom.xml的build模塊后,就可以通過mvn package 或者mvn install打出我們的jar包了


4. 項目管理shell腳本編寫
自定義shell腳本,實現項目的啟動,停止,狀態,重啟操作:

#!/bin/bash 
#這里可替換為你自己的執行程序,其他代碼無需更改 
APP_NAME=demo1-0.0.1-SNAPSHOT.jar 
JVM="-server -Xms512m -Xmx512m -XX:PermSize=64M -XX:MaxNewSize=128m -XX:MaxPermSize=128m -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
APPFILE_PATH="-Dspring.config.location=/usr/local/demo/config/application-demo1.properties"
#使用說明,用來提示輸入參數 
usage() { 
echo "Usage: sh 執行腳本.sh [start|stop|restart|status]" 
exit 1 

#檢查程序是否在運行 
is_exist(){ 
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` 
#如果不存在返回1,存在返回0 
if [ -z "${pid}" ]; then 
return 1 
else 
return 0 
fi 

#啟動方法 
start(){ 
is_exist 
if [ $? -eq "0" ]; then 
echo "${APP_NAME} is already running. pid=${pid} ." 
else 
nohup java $JVM -jar $APPFILE_PATH $APP_NAME > /dev/null 2>&1 
fi

#停止方法 
stop(){ 
is_exist 
if [ $? -eq "0" ]; then 
kill -9 $pid 
else 
echo "${APP_NAME} is not running" 
fi 

#輸出運行狀態 
status(){ 
is_exist 
if [ $? -eq "0" ]; then 
echo "${APP_NAME} is running. Pid is ${pid}" 
else 
echo "${APP_NAME} is NOT running." 
fi 

#重啟 
restart(){ 
stop 
start 

#根據輸入參數,選擇執行對應方法,不輸入則執行使用說明 
case "$1" in 
"start") 
start 
;; 
"stop") 
stop 
;; 
"status") 
status 
;; 
"restart") 
restart 
;; 
*) 
usage 
;; 
esac
5. 部署

linux服務器上新建個文件夾,將我們打好的項目jar包都丟進去,在jar包的同級目錄新建config和lib文件夾,分別將配置文件和第三方依賴包丟進去,其結構如下圖,*.sh為自己寫的項目啟動shell腳本



打開config內的springboot核心文件(如application-demo1.properties文件),

spring.profiles.path配置項改成當前配置文件所在的目錄,假設為/usr/local/demo/config

打開*.sh腳本,修改APPFILE_PATH的值,如下

APPFILE_PATH="-Dspring.config.location=/usr/local/demo/config/application-demo1.properties"



6. 項目管理

進入jar包所在目錄執行下面命令

sh demo1.sh start 啟動項目

sh demo1.sh stop 停止項目

sh demo1.sh restart重啟項目

sh demo1.sh status項目狀態
————————————————
轉載:https://blog.csdn.net/xrq0508/article/details/80050119


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM