packaging设为pom时Maven如何生成含flyway资源的独立jar包
适配packaging=pom的Flyway脚本Jar打包方案
之前配置失效的核心原因
- 绑定
test-jar目标时,插件默认扫描路径为src/test/resources,和项目实际存放脚本的src/resources路径不匹配 classesDirectory配置指到src根目录时,生成的jar内文件会带上resources路径前缀,不符合类加载路径规范,既没法被Flyway正常识别,也没法被其他项目作为通用依赖引入- packaging为pom时,Maven默认生命周期不会触发jar插件的常规产物绑定,手动生成的jar属于游离文件,不会自动进入本地仓库、Artifactory的安装/部署流程
完整配置步骤
1. 配置maven-jar-plugin生成目标jar
全程不修改项目的packaging配置,直接在build标签下添加jar插件绑定,将打jar逻辑关联到package生命周期阶段:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <id>package-flyway-scripts</id> <phase>package</phase> <goals> <goal>jar</goal> </goals> <configuration> <!-- 指向实际存放资源的根目录,保证jar内路径和常规Maven项目资源路径一致 --> <classesDirectory>${project.basedir}/src/resources</classesDirectory> <!-- 仅打包flyway目录下的所有脚本,排除其他无关文件 --> <includes> <include>flyway/**</include> </includes> <!-- 即使目录下没有class文件,也正常生成jar --> <skipIfEmpty>false</skipIfEmpty> <!-- 关闭多余的清单文件条目,避免和其他依赖冲突 --> <archive> <manifest> <addDefaultImplementationEntries>false</addDefaultImplementationEntries> <addDefaultSpecificationEntries>false</addDefaultSpecificationEntries> </manifest> </archive> </configuration> </execution> </executions> </plugin>
2. 关联生成的Jar为项目正式构件
因为packaging为pom时,Maven默认只会将pom文件作为主构件处理,需要通过build-helper-maven-plugin将刚才生成的jar绑定到当前项目的GAV坐标下,保证install、deploy流程能自动识别该产物:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.4.0</version> <executions> <execution> <id>attach-flyway-jar</id> <phase>package</phase> <goals> <goal>attach-artifact</goal> </goals> <configuration> <artifacts> <artifact> <!-- 路径和jar插件默认输出路径保持一致 --> <file>${project.build.directory}/${project.build.finalName}.jar</file> <type>jar</type> </artifact> </artifacts> </configuration> </execution> </executions> </plugin>
3. 适配Artifactory部署
原有配置的artifactory-maven-plugin不需要修改,插件会自动扫描到所有绑定的项目构件,在执行deploy阶段时自动将pom和jar一起上传到内部仓库,不需要额外添加部署规则。
关键避坑点
- 不要使用
test-jar执行目标:该目标生成的jar会被标记为测试范围类型,其他项目引入时需要额外配置类型参数,不符合通用依赖引入规范 - 不要将
classesDirectory指到src根目录:会导致jar内路径出现resources/flyway前缀,其他项目引入后Flyway默认的classpath:flyway扫描规则无法识别脚本 - 不要开启
skipIfEmpty=true:当前目录下只有SQL脚本没有Java类,开启后插件会判定目录为空直接跳过jar生成 - 不需要修改packaging为jar:所有打包逻辑通过插件绑定即可完成,全程保持pom类型符合硬性约束
构建验证流程
- 执行
mvn clean package,解压target目录下生成的jar,确认内部路径为flyway/xxx.sql,无多余前缀、无无关class文件 - 执行
mvn clean install,检查本地.m2/repository下对应GAV路径,确认同时存在与项目版本匹配的pom和jar文件 - 在其他项目中通过普通依赖坐标引入该构件,验证Flyway能正常扫描到jar内的迁移脚本
内容的提问来源于stack exchange,提问作者Lisek
相关产品推荐
相关产品推荐

