SpringBoot打包将jar包与lib依赖、配置文件分开

pom 文件的相关 maven 打包插件

maven-compiler-plugin、maven-surefire-plugin、maven-jar-plugin、maven-dependency-plugin、maven-resources-plugin
以下是对这些 Maven 插件的简要说明以及它们之间的关系:

  1. maven-compiler-plugin:该插件用于编译项目的 Java 源代码。它可以配置编译器版本、源代码目录、编译输出目录等。它是 Maven 构建过程中的一个核心插件。

  2. maven-surefire-plugin:该插件用于执行项目的单元测试。它可以配置测试源代码目录、测试报告输出目录、测试用例匹配模式等。它负责运行测试并生成测试报告。

  3. maven-jar-plugin:该插件用于创建项目的 JAR 文件。它会将编译好的类文件、资源文件等打包到 JAR 文件中,并可以配置主类、依赖项、过滤规则等。它是创建可执行 JAR 文件的关键插件。

  4. maven-dependency-plugin:该插件用于管理项目的依赖项。它可以从 Maven 仓库中下载依赖项、解析依赖树、复制依赖项到指定目录等。它提供了许多与依赖项相关的功能,例如生成依赖报告、分析依赖冲突等。

  5. maven-resources-plugin:该插件用于处理项目的资源文件。它可以复制和过滤资源文件到输出目录,例如配置文件、模板文件等。它还可以对资源文件进行编码转换、过滤替换等操作。

这些插件之间的关系如下:

  • maven-compiler-plugin 在编译阶段使用,将项目的 Java 源代码编译为字节码文件。

  • maven-surefire-plugin 在测试阶段使用,运行项目的单元测试。

  • maven-jar-plugin 在打包阶段使用,将项目的编译输出文件打包为 JAR 文件。

  • maven-dependency-plugin 可以在构建的不同阶段使用,用于管理和处理项目的依赖项。

  • maven-resources-plugin 在资源处理阶段使用,处理项目的资源文件。

这些插件可以根据项目的需要进行配置和使用,并且可以相互配合实现各种构建和打包需求。

整个项目的目录结构

在这里插入图片描述

父pom文件配置

properties标签中定义项目保存目录、依赖的输出目录、jar包的输出目录、resources中配置文件的输出目录、编码格式。

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!--依赖输出目录-->
        <env.LEARN_HOME>${project.parent.artifactId}</env.LEARN_HOME>
        <!--依赖输出目录-->
        <output.dependence.file.path>lib/</output.dependence.file.path>
        <!--jar输出目录-->
        <output.jar.file.path>bin/</output.jar.file.path>
        <!--配置文件输出目录-->
        <output.resource.file.path>config/</output.resource.file.path>
    </properties>

启动类所在的web模块的pom文件配置

    <build>
       <plugins>
           <!--compiler-->
           <!--用于编译项目的 Java 源代码-->
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.1</version>
               <configuration>
                   <source>${java.version}</source>
                   <target>${java.version}</target>
               </configuration>
           </plugin>
           <!--surefire-->
           <!--用于执行项目的单元测试-->
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>2.19.1</version>
               <configuration>
                   <skipTests>true</skipTests>    <!--默认关掉单元测试 -->
               </configuration>
           </plugin>
           <!--jar-->
           <!-- 打JAR包,不包含依赖文件;显式剔除配置文件 -->
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-jar-plugin</artifactId>
               <configuration>
                   <!--${env.LEARN_HOME}为项目配置的环境变量,下同-->
                   <outputDirectory>${env.LEARN_HOME}/${output.jar.file.path}</outputDirectory>
                   <!-- 将配置文件排除在jar包 -->
                   <excludes>
                       <exclude>*.properties</exclude>
                       <exclude>*.yml</exclude>
                       <exclude>*.xml</exclude>
                       <exclude>*.txt</exclude>
                   </excludes>
                   <archive>
                       <!-- 生成的jar中,包含pom.xml和pom.properties这两个文件 -->
                       <addMavenDescriptor>true</addMavenDescriptor>
                       <!-- 生成MANIFEST.MF的设置 -->
                       <manifest>
                           <!--这个属性特别关键,如果没有这个属性,有时候我们引用的包maven库下面可能会有多个包,并且只有一个是正确的,
                           其余的可能是带时间戳的,此时会在classpath下面把那个带时间戳的给添加上去,然后我们在依赖打包的时候,
                           打的是正确的,所以两头会对不上,报错。 -->
                           <useUniqueVersions>false</useUniqueVersions>
                           <!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
                           <addClasspath>true</addClasspath>
                           <!-- MANIFEST.MF 中 Class-Path 各个依赖加入前缀 -->
                           <!--这个jar所依赖的jar包添加classPath的时候的前缀,需要 下面maven-dependency-plugin插件补充-->
                           <!--一定要找对目录,否则jar找不到依赖lib,前边加../是因为jar在bin下,而bin与lib是平级目录-->
                           <classpathPrefix>../${output.dependence.file.path}</classpathPrefix>
                           <!--指定jar启动入口类 -->
                           <mainClass>com.web.ServerApplication</mainClass>
                       </manifest>
                       <manifestEntries>

                           <!-- 假如这个项目可能要引入一些外部资源,但是你打包的时候并不想把 这些资源文件打进包里面,这个时候你必须在
                           这边额外指定一些这些资源文件的路径,假如你的pom文件里面配置了 <scope>system</scope>,就是你依赖是你本地的
                           资源,这个时候使用这个插件,classPath里面是不会添加,所以你得手动把这个依赖添加进这个地方 -->
                           <!--MANIFEST.MF 中 Class-Path 加入自定义路径,多个路径用空格隔开 -->
                           <!--此处resources文件夹的内容,需要maven-resources-plugin插件补充上-->
                           <Class-Path>../${output.resource.file.path}</Class-Path>
                       </manifestEntries>
                   </archive>
               </configuration>
           </plugin>
           <!--dependency-->
           <!-- 复制依赖的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>${env.LEARN_HOME}/${output.dependence.file.path}</outputDirectory>
                           <!-- 是否排除间接依赖,间接依赖也要拷贝 -->
                           <excludeTransitive>false</excludeTransitive>
                           <!-- 是否带上版本号 -->
                           <stripVersion>false</stripVersion>
                       </configuration>
                   </execution>
               </executions>
           </plugin>
           <!--resources-->
           <!-- 用于复制指定的resources文件 -->
           <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>
                                       <!--将如下格式配置文件拷贝-->
                                       <exclude>*.properties</exclude>
                                       <exclude>*.yml</exclude>
                                       <exclude>*.xml</exclude>
                                       <exclude>*.txt</exclude>
                                   </includes>
                               </resource>
                           </resources>
                           <!--输出路径-->
                           <outputDirectory>${env.LEARN_HOME}/${output.resource.file.path}</outputDirectory>
                       </configuration>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>

最终效果:

在这里插入图片描述
多模块项目隔离依赖打包方式文件的总大小,和整个项目打成一个jar包的大小对比:
整个项目打成一个jar包的大小:
在这里插入图片描述
隔离依赖打包方式文件的总大小:
在这里插入图片描述

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值