美文网首页程序员
使用Spring boot开发,将程序和资源分别打包的方法

使用Spring boot开发,将程序和资源分别打包的方法

作者: 杞梓林 | 来源:发表于2019-12-13 14:13 被阅读0次

    需求

    项目代码使用Spring boot 框架,由于Spring boot集成了tomcat,所以就不再打成war包了,直接打成jar包运行。但项目内容较多,产生了大量的依赖包,同时还有各种资源文件,想要将主程序、依赖以及配置文件分别打包。

    解决方案

    1 使用maven插件

    pom中为build增加<finalName></finalName>标签,内容为打包后jar的名称。
    增加plugin:

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <!-- 不打包资源文件(配置文件和依赖包分开) -->
                        <excludes>
                            <exclude>*.**</exclude>
                            <exclude>*/*.xml</exclude>
                        </excludes>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
                                <classpathPrefix>lib/</classpathPrefix>
                                <!-- jar包不包含唯一版本标识 -->
                                <useUniqueVersions>false</useUniqueVersions>
                                <!--指定入口类 -->
                                <mainClass>xxx.xxx.xxx.xxApplication</mainClass>
                            </manifest>
                            <manifestEntries>
                                <!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
                                <Class-Path>./resources/</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/</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <!-- 该插件的作用是用于复制指定的文件 -->
                <plugin>
                    <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>*.properties</include> -->
                                        </includes>
                                    </resource>
                                </resources>
                                <outputDirectory>${project.build.directory}/resources</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <!-- SpringBoot 打包插件,把 maven-jar-plugin 打成的jar包重新打成可运行jar包 -->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖 -->
                        <includes>
                            <include>
                                <groupId>null</groupId>
                                <artifactId>null</artifactId>
                            </include>
                        </includes>
                        <layout>ZIP</layout>
                        <!--使用外部配置文件,jar包里没有资源文件 -->
                        <addResources>true</addResources>
                        <outputDirectory>${project.build.directory}/resources</outputDirectory>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                            <configuration>
                                <!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar -->
                                <!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar -->
                                <!--<classifier>run</classifier> -->
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    

    2 spring-boot-starter-web依赖的修改

    打包插件使用了log4j2作为日志框架,所以需要去掉springboot的默认log框架logging,同时增加log4j2依赖,具体如下:

          <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions><!-- 去掉springboot默认配置 -->
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency> <!-- 引入log4j2依赖 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>
    

    3 打包指令及生成文件

    直接再Terminal中执行

    mvn package
    

    打包成功后,会在target文件夹下生成内容。主要包括:
    1.XXX.jar —— 主程序,程序运行执行的jar
    2.lib —— 依赖包
    3.resources —— 资源文件,其下还会有一个XXX.jar

    这样在每次程序更新后,如果依赖或者资源没有变化的情况下,只需要更新对应的两个jar包就可以了。

    另外,一个容易忽略的地方
    打包的时候会执行test程序,所以需要保证Test主类以及contextLoads方法是public。

    相关文章

      网友评论

        本文标题:使用Spring boot开发,将程序和资源分别打包的方法

        本文链接:https://www.haomeiwen.com/subject/rvefnctx.html