springboot项目依赖分离打包完美解决方案

原创
2024/11/23 15:31
阅读数 305

前言:在工作中,很多客户因为安全、隐私、敏感数据等原因,可能要求項目进行本地化部署;此时,如果一整套系统项目很多,且网络又受限制,咱们就需要给jar瘦身;一般而言,第二次部署的时候,同一个项目的依赖lib是不变的,所以依赖lib在第二次部署时不需要上传;

第一种打包方案:

    <!-- Package as an executable jar -->
    <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>*.yml</include>
                    <include>**/*.xml</include>
                    <include>**/*.txt</include>
                    <include>**/*.properties</include>
                    <include>**/*.md</include>
                    <include>**/*.key</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>**/*.jks</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <!-- 配置资源文件的打包路径 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <!-- 可选配置 -->
                <configuration>
                    <source>1.8</source>
                    <!-- 源代码使用的JDK版本 -->
                    <target>1.8</target>
                    <!-- 生成的目标class文件的JDK编译版本 -->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
                    <!-- 排除不需要打进jar包的文件,也就是上面config目录中的文件 -->
                    <excludes>
                        <exclude>**/*.yml</exclude>
                    </excludes>
                    <archive>
                        <!-- 程序入口,即main函数 -->
                        <manifest>
                            <mainClass>com.xxx.xxxApplication</mainClass>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>config/.</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <!-- 把jar复制到target目录下的lib目录下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- ${project.build.directory}就是我们通常看到的target目录 -->
                            <outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/${project.artifactId}/config</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${project.build.directory}/classes</directory>
                                    <includes>
                                        <include>*.yml</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 跳过测试编译 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
        <!-- 自定义打包后的jar包名称 -->
        <finalName>${project.artifactId}-${project.version}</finalName>
    </build>

打包結果:

执行启动命令:nohup java -jar xxx.jar -Dspring.config.location=file:./config/ -Dfile.encoding=utf-8 > /dev/null 2>&1 &

缺点:如果项目中依赖了公司某个共用的lib包,而这个经常会升,此时就需要将升级包和应用小包一起都替换才行;原因是应用小包内部的META-INF下面的MANIFEST.MF文件里面将jar启动和依赖的lib包带上版本的形式固定写死;

优点:启动时,不需要添加额外参数-Dloader.path=./lib;

第二种打包方案:

    <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>*.yml</include>
                    <include>**/*.xml</include>
                    <include>**/*.txt</include>
                    <include>**/*.properties</include>
                    <include>**/*.md</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <!-- 配置资源文件的打包路径 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <!-- 可选配置 -->
                <configuration>
                    <source>1.8</source>
                    <!-- 源代码使用的JDK版本 -->
                    <target>1.8</target>
                    <!-- 生成的目标class文件的JDK编译版本 -->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.xxx.xxxxApplication</mainClass>
                    <!-- 排除systemScope的依赖jar -->
                    <includeSystemScope>false</includeSystemScope>
                    <!-- 分离jar -->
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                    <outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <delete>
                                    <fileset dir="${project.build.directory}/${project.artifactId}/" includes="*.jar.original"/>
                                </delete>
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
                    <!-- 排除不需要打进jar包的文件,也就是上面config目录中的文件 -->
                    <excludes>
                        <exclude>application*.yml</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- 把jar复制到target目录下的lib目录下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- ${project.build.directory}就是我们通常看到的target目录 -->
                            <outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/${project.artifactId}/config</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${project.build.directory}/classes</directory>
                                    <includes>
                                        <include>application.yml</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 跳过测试编译 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
        <!-- 自定义打包后的jar包名称 -->
        <finalName>${project.artifactId}-${project.version}</finalName>
    </build>

打包結果:

执行启动命令: nohup java -Dloader.path=./lib/ -Dspring.config.location=file:./bb/config/ -Dfile.encoding=utf-8 -jar xxx.jar - > /dev/null 2>&1 &

缺点:启动时,需要添加额外参数-Dloader.path=./lib;

优点:如果项目中依赖了公司某个共用的lib包,而这个经常会升级,此时只需要将共用升级包替换就行;

很旧没有更新博客,后续有时间会持续更新;

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部