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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值