Springboot项目瘦身之如何将jar包与lib依赖分开打包
目录
- 将jar包与lib依赖分开打包
- 方法一:项目和依赖完全分离
- 方法二:部分依赖打入jar文件
- jar文件和lib打包命令
- 总结
将jar包与lib依赖分开打包
方法一:项目和依赖完全分离
maven-jar-plugin 负责生成 jar 文件(jar文件中不包含如何依赖),并为 jar 文件的 manifest.mf 文件配置相关内容;maven-dependency-plugin 插件用于在构建时将项目的运行时依赖项复制到指定目录。
部署项目时,生产的jar文件要和lib依赖包在同一目录下。
<build> <!-- 生成的jar名称 --> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <!-- 生成的jar中不要包含pom.XML和pom.properties这两个文件 --> <addMavenDescriptor>false</addMavenDescriptor> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <!--这里需要修改为你的项目的主启动类--> <mainClass>你的启动类路径</mainClass> <!-- 是否使用唯一版本号,控制 MANIFEST.MF 中类路径的版本格式;如果不加,可能会出现依赖后面加时间戳--> <useUniqueVersions>false</useUniqueVersions> </manifest> </archive> </configuration> </plugin> <!--拷贝依赖的jar外面的lib目录--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-lib</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 指定依赖拷贝的输出目录 --> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 不排除传递性依赖 --> <excludeTransitive>false</excludeTransitive> <!-- 不移除依赖版本号 --> <stripVersion>false</stripVersion> <!-- 仅包含 runtime 范围的依赖 --> <includeScope>runtime</includeScope> <!-- 排除 common 和 coo 依赖 --> <excludeArtifactIds>common,coo</excludeArtifactIds> </configuration> </execution> </executions> </plugin> </plugins> </build>
方法二:部分依赖打入jar文件
maven-jar-plugin
插件用于生成主 JAR 文件,并配置 MANIFEST.MF 文件中的相关信息;maven-shade-plugin
插件用于将一些特定的依赖项(例如 common 和 coo)打包到主 JAR 文件中,通常用于创建一个"uber JAR"(即包含所有依赖的 JAR);maven-dependency-plugin
插件用于在构建过程中将除指定依赖(如 common 和 coo)外的其他所有运行时依赖复制到 lib/ 目录;
因为maven-jar-plugin会生成一个无依赖的jar文件,所以不需要的情况下可以删除掉,maven-antrun-plugin 插件用于执行一些额外的任务,比如删除不需要的 JAR 文件。
部署项目时,生产的jar文件要和lib依赖包在同一目录下。
<build> <plugins> <!-- maven-jar-plugin 用于生成主 JAR 文件,并配置 MANIFEST.MF 文件指定lib文件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <id>default-jar</id> <phase>package</phase> android <goals> <goal>jar</goal> </goals> </execution> </executions> <configuration> <archive> <!-- 包中包含 Maven 描述符(如 pom.xml 和 pom.properties 文件) --> <addMavenDescriptor>true</addMavenDescriptor> <manifest> <!-- 在 MANIFEST.MF 中添加类路径 --> <addClasspath>true</addClasspath> <!-- 指定依赖的类路径前缀为 lib/ --> <classpathPrefix>lib/</classpathPrefix> <!-- 指定主启动类 --> <mainClass>你的启动类路径</mainClass> <!-- 使用非唯一版本(不在依赖路径中添加版本号) --> <useUniqueVersions>false</useUniqueVersions> </manifest> </archive> </configuration> </plugin> <!-- maven-shade-plugin 用于将指定依赖(如 common 和 coo)打包进主 JAR --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <!-- 在 package 阶段执行 --> <phase>package</phase> <goals> <!-- 使用 shade 目标 --> <goal>shade</goal> </goals> <configuration> <artifactSet> <!-- 指定需要包含在主 JAR 中的依赖 --> <includes> <include>com.test:common</include> <include>com.test:coo</include> </includes> </artifactSet> <!-- 禁用生成附加的 original-xxx.jar 文件 --> <shadeDartifactAttached>false</shadedArtifactAttached> <!-- 禁用生成 dependency-reduced-pom.xml 文件 --> <createDependencyReducedPom>false</createDependencyReducedPom> <!-- 自定义最终生成的 JAR 包名称 --> <finalName>${project.artifactId}</finalName> </configuration> </execution> </executions> </plugin> <!-- maven-dependency-plugin 用于将除 common 和 coo 外的其他依赖拷贝到 lib 文件夹 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <!-- 设置执行的 ID --> <id>copy-lib</id> <!-- 在 package 阶段执行 --> <phase>package</phase> <goals> <!-- 使用 copy-dependencies 目标 --> www.devze.com <goal>copy-dependencies</goal> </goals> <configuration> <!-- 指定依赖拷python贝的输出目录 --> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 不排除传递性依赖 --> <excludeTransitive>false</excjsludeTransitive> <!-- 不移除依赖版本号 --> <stripVersion>false</stripVersion> <!-- 仅包含 runtime 范围的依赖 --> <includeScope>runtime</includeScope> <!-- 排除 common 和 coo 依赖 --> <excludeArtifactIds>common,coo</excludeArtifactIds> </configuration> </execution> </executions> </plugin> <!-- maven-antrun-plugin 用于删除多余的 JAR 文件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <!-- 在 package 阶段执行 --> <phase>package</phase> <configuration> <tasks> <!-- 删除由 maven-jar-plugin 生成的默认 JAR 文件 --> <delete file="${project.build.directory}/${project.artifactId}-${project.version}.jar" /> </tasks> </configuration> <goals> <!-- 使用 run 目标 --> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
jar文件和lib打包命令
maven-assembly-plugin 配置是用于 Maven 项目的构建过程,生成一个压缩包(tar 或 zip 格式)并将其输出到指定的目录
<!--maven-assembly-plugin 用于打包项目生成压缩文件--> <plugin> <!-- 指定使用的插件:maven-assembly-plugin --> <artifactId>maven-assembly-plugin</artifactId> <configuration> <!-- 是否将assembly的ID添加到生成包的名称中。设为false时,不会在包名中添加ID。 --> <appendAssemblyId>false</appendAssemblyId> <!-- 指定最终生成的tar或zip包的文件名,这里设置为djys-business。 --> <finalName>build-jar</finalName> <!-- 输出目录,生成的tar或zip包会存放在target目录下。 --> <outputDirectory>target/</outputDirectory> <descriptors> <!-- 指定引用的assembly配置文件,这里引用src/main/resources/assembly.xml --> <descriptor>src/main/resources/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <!-- 执行ID,可以任意命名,这里使用make-assembly。 --> <id>make-assembly</id> <!-- 将该插件绑定到package生命周期阶段,当执行mvn package时会调用该插件。 --> <phase>package</phase> <goals> <!-- 设置插件目标,这里使用single目标,它会创建单个压缩包(tar/zip)。 --> <goal>single</goal> </goals> </execution> </executions> </plugin>
assembly.xml文件内容
<assembly xmlns="http://maven.apache.org/ASSEMBLY/3.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/3.3.0 http://maven.apache.org/xsd/assembly-3.3.0.xsd"> <id>package</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <!-- <!–拷贝application.yml文件到jar包的外部config目录下面–>--> <!-- <fileSet>--> <!-- <directory>${basedir}/src/main/resources</directory>--> <!-- <includes>--> <!-- <include>*.yml</include>--> <!-- </MqcOjfeeOincludes>--> <!-- <filtered>true</filtered>--> <!-- <outputDirectory>${file.separator}config</outputDirectory>--> <!-- </fileSet>--> <!--拷贝lib包到jar包的外部lib下面--> <fileSet> <directory>${project.build.directory}/lib</directory> <outputDirectory>${file.separator}lib</outputDirectory> <!-- 打包需要包含的文件 --> <includes> <include>*.jar</include> </includes> </fileSet> <!--如有需要,可以配置多个需要拷贝的文件即可--> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>${file.separator}</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> </fileSets> </assembly>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论