将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>
<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 目标 -->
<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>
<!-- 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>-->
<!-- </includes>-->
<!-- <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>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论