Loading... ## 每日一听 <div class='handsome_aplayer player-content' data-preload="auto" data-autoplay="false" data-listMaxHeight="340px" data-order="list"> <div class="handsomePlayer-tip-loading"><span></span> <span></span> <span></span> <span></span><span></span></div><div class="handsome_aplayer_music" data-id="548808659" data-server="netease" data-type="song" data-auth="0c9eb96c57513e1f5005cb4a1f2c166e"></div> </div> --- ## 需求背景 SpringBoot项目每次改动,都需要将整个项目重新打包部署,而且打包后的jar包太大,远程部署时很不方便,尤其是网让吃了的时候,整个人能烦死。 所以把lib里面的jar包从项目分离出来,每次部署只需要发布修改过的jar包就行啦。 --- ## Maven ### 修改 `pom.xml` 文件 #### 创建SpringBoot项目后默认的打包配置 ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` #### 在properties标签中定义变量 ```xml <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默认打包配置 ```xml <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> ``` ### 开始打包  > `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` 任务  > `config` 配置文件所在目录 > `lib` 依赖所在目录 > `gradle-sever-pack-demo.jar` 启动 jar 包 ### 启动运行 运行gradle-sever-pack-demo.jar --- > 如有侵权,请联系作者 [马铃薯头](mailto:m@xlsea.cn?subject=文章侵权告知) 删除 最后修改:2023 年 03 月 02 日 © 允许规范转载 赞 2