SpringBoot打包成jar包時配置分離,依賴jar分離

前言:

在springboot官方文檔中貌似沒找到,把依賴和配置文件打包出來的教學。不過卻看到了有趣的東西。那就是spingboot加載配置文件的順序,優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
–file:./config/
–file:./
–classpath:/config/
–classpath:/

所以當時想的第一種方法就是配置一下pom.xml打包的時候排除config下的所有配置文件,手動copy一個config文件夾在jar包旁邊。這樣通過命令行啓動的時候呢就會springboot自動加載當前目錄下的config,優先級高覆蓋,完美解決的配置文件的問題。的確一開始我也是這樣做的。後來翻了翻百度。發現原來公司裏面還要分離jar包,目的是另外如果某個依賴jar有修改,則只需要替換依賴的jar並重啓即可,不需要重新打包。所以這裏就學習了一下,記錄下來。

開始正片:

使用到的插件是:
maven-jar-plugin
maven-assembly-plugin

目錄結構:

在這裏插入圖片描述
這裏看到主要的需要分離的是config下的配置文件。所以下一步配置pom.xml

先配置打包jar包的插件

 <!-- 打jar包的插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib</classpathPrefix>
                            <!-- 程序啓動入口 -->
                            <mainClass>com.awakeyo.wangpengdemo.WangpengdemoApplication</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>./</Class-Path>
                        </manifestEntries>
                    </archive>
                    <excludes>
                        <exclude>config/**</exclude>
                    </excludes>
                </configuration>
            </plugin>

maven-jar-plugin的配置:
manifest的部分是核心,在可執行的jar文件中,打包後會在jar文件內的META-INF文件夾下,生成一個MANIFEST.MF文件,裏面記錄了可執行文件的一些相關配置,比如像上面一段代碼中所配置的內容,這裏面就配置了可執行jar文件未來讀取classpath的相對目錄位置在什麼地方,以及引入的jar文件都有哪些
mainClass:哪個class作爲程序的入口來執行
addClasspath:是否將依賴的classpath一起打包
classpathPrefix:依賴的classpath的前綴,也就是打包後生成的MANIFEST.MF文件裏,引入的jar文件都會加上前綴,lib/,比如fastjson-1.2.7.jar,在mainfest文件裏就會是lib/fastjson-1.2.7.jar
excludes:排除哪些文件夾不被打包進去

配置將jar包和外部配置等文件整體打包

<plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!--jar包名稱-->
                    <finalName>${project.artifactId}-${project.version}</finalName>
                    <!--描述文件路徑-->
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-zip</id>
                        <!-- 綁定到package生命週期階段上 -->
                        <phase>package</phase>
                        <goals>
                            <!-- 只運行一次 -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

配置assembly.xml 文件

<?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/config</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>
        <!-- 將項目啓動jar打包到boot目錄中 -->
        <fileSet>
            <directory>${basedir}/target</directory>
            <outputDirectory>/</outputDirectory>
            <fileMode>0755</fileMode>
            <includes>
                <include>${project.build.finalName}.jar</include>
            </includes>
        </fileSet>
    </fileSets>
        <!-- 將第三方依賴打包到lib目錄中 -->
        <dependencySets>
            <dependencySet>
                <outputDirectory>lib</outputDirectory>
                <scope>runtime</scope>
                <!--<unpack>false</unpack> -->
                <excludes>
                    <!--<exclude>${project.name}-${project.version}</exclude> -->
                    <exclude>${groupId}:${artifactId}</exclude>
                </excludes>
            </dependencySet>
        </dependencySets>
        <!-- 包含根目錄下的文件 -->
<!--        <fileSet>-->
<!--            <directory>${basedir}</directory>-->
<!--            <includes>-->
<!--                <include>NOTICE</include>-->
<!--                <include>LICENSE</include>-->
<!--                <include>*.md</include>-->
<!--            </includes>-->
<!--        </fileSet>-->

</assembly>

最後打包即可,最終目錄如圖在這裏插入圖片描述
寫了個等於沒寫的shell腳本,進bin目下

./demostart.sh

即可啓動springboot項目。
在這裏插入圖片描述
看到springboot輸出就安心了。

語法主要參考於blog:
https://www.iteye.com/blog/blueram-1684070
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章