每日一听


需求背景

SpringBoot项目每次改动,都需要将整个项目重新打包部署,而且打包后的jar包太大,远程部署时很不方便,尤其是网让吃了的时候,整个人能烦死。
所以把lib里面的jar包从项目分离出来,每次部署只需要发布修改过的jar包就行啦。


Maven

修改 pom.xml 文件

创建SpringBoot项目后默认的打包配置

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

在properties标签中定义变量

<properties>
    <!--依赖输出目录-->
    <lib-path>lib</lib-path>
    <!--springboot默认打包输出目录-->
    <jar-path>jar</jar-path>
    <!--配置文件输出目录-->
    <config-path>config</config-path>
    <!--jar包名称-->
    <final-name>maven-sever-pack-demo</final-name>
    <!--指定启动类-->
    <main-class>cn.xlsea.demo.MavenSeverPackDemoApplication</main-class>
</properties>

替换SpringBoot默认打包配置

<build>
    <!--项目名称-->
    <finalName>${final-name}</finalName>
    <plugins>
        <!--定义项目的编译环境-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <!--maven的测试用例插件,建议跳过。-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <!--这个是springboot的默认编译插件,他默认会把所有的文件打包成一个jar-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>${main-class}</mainClass>
                <fork>true</fork>
                <addResources>true</addResources>
                <outputDirectory>${project.build.directory}/${jar-path}</outputDirectory>
            </configuration>
        </plugin>
        <!-- 打JAR包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <!-- 不打包资源文件(配置文件和依赖包分开) -->
                <excludes>
                    <exclude>*.yml</exclude>
                </excludes>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
                        <classpathPrefix>${lib-path}/</classpathPrefix>
                        <!-- jar包不包含唯一版本标识 -->
                        <useUniqueVersions>false</useUniqueVersions>
                        <!--指定入口类 -->
                        <mainClass>${main-class}</mainClass>
                    </manifest>
                    <manifestEntries>
                        <!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
                        <Class-Path>./${config-path}/</Class-Path>
                    </manifestEntries>
                </archive>
                <outputDirectory>${project.build.directory}</outputDirectory>
            </configuration>
        </plugin>
        <!-- 该插件的作用是用于复制依赖的jar包到指定的文件夹里 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/${lib-path}/</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- 该插件的作用是用于复制指定的文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <!-- 复制配置文件 -->
                <execution>
                    <id>copy-resources</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <resources>
                            <resource>
                                <directory>src/main/resources</directory>
                                <includes>
                                    <include>*.yml</include>
                                </includes>
                            </resource>
                        </resources>
                        <outputDirectory>${project.build.directory}/${config-path}</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

开始打包

maven打包

config 配置文件所在目录
lib 依赖所在目录
jar springboot默认打包插件的 jar 包
maven-sever-pack-demo.jar 启动 jar 包

启动运行

运行maven-sever-pack-demo.jar,启动成功:
启动运行


Gradle

修改 build.gradle 配置文件

// 将依赖包复制到lib目录
task copyJar(type: Copy) {
    // 清除现有的lib目录
    delete "$buildDir/libs/lib"
    from configurations.runtimeClasspath
    into "$buildDir/libs/lib"
}

// 拷贝配置文件
task copyResources(type: Copy) {
    // 清除现有的配置目录
    delete "$buildDir/libs/config"
    from "src/main/resources"
    into "$buildDir/libs/config"
    // 只复制yml配置文件
    include "*.yml"
    // 排除指定文件
    // exclude "application.yml"
}

// 配置bootJar进行打包
bootJar {
    // 排除lib目录及yml配置文件
    excludes = ["*.jar", "*.yml"]
    // 引入需要的文件(多模块项目下可引入指定jar包)
    // includes = ['common-${project.version}.jar']
    // lib目录的清除和复制任务
    dependsOn copyJar
    // 配置目录的清除和复制任务
    dependsOn copyResources
    // 指定依赖包的路径
    manifest {
        attributes "Manifest-Version": 1.0,
                'Class-Path': 'config/ ' + configurations.runtimeClasspath.files.collect { "lib/$it.name" }.join(' ')
    }
}

开始打包

执行 bootJar 任务

gradle打包

config 配置文件所在目录
lib 依赖所在目录
gradle-sever-pack-demo.jar 启动 jar 包

启动运行

运行gradle-sever-pack-demo.jar


如有侵权,请联系作者 马铃薯头 删除
最后修改:2023 年 03 月 02 日
温柔的好天气总是和我一样,帅的鸭皮!