如何将父Maven项目中的文件复制到子项目生成的JAR中
如何让父Maven项目的LICENSE/NOTICE文件被子项目打包进JAR
你遇到的问题很典型——父POM里的<resources>配置并不会自动被子项目继承,而且子项目构建时默认只会扫描自己的资源目录,没法直接访问父项目的src/license文件夹。下面给你一个直接有效的解决办法:
使用maven-resources-plugin实现跨项目资源复制
在父POM的<build><plugins>中添加以下配置,通过插件绑定到构建阶段,让子项目自动复制父项目的许可证文件到自己的输出目录:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <!-- 建议使用最新稳定版,避免兼容性问题 --> <executions> <execution> <id>copy-parent-license-files</id> <phase>process-resources</phase> <!-- 在资源处理阶段执行复制 --> <goals> <goal>copy-resources</goal> </goals> <configuration> <!-- 输出到子项目的classes/META-INF目录,最终会被打包进JAR --> <outputDirectory>${project.build.outputDirectory}/META-INF</outputDirectory> <resources> <resource> <!-- 用Maven内置属性指向父项目的根目录 --> <directory>${project.parent.basedir}/src/license</directory> <includes> <include>LICENSE.txt</include> <include>NOTICE.txt</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build>
配置说明:
${project.parent.basedir}是Maven的内置属性,只要子项目的<parent>节点配置正确,就能精准定位到父项目的根目录,不用担心路径写错。- 插件绑定到
process-resources阶段,这个阶段在子项目编译前执行,复制后的文件会被放到target/classes/META-INF下,最终自然会被打包进JAR包。 - 指定插件版本是个好习惯,避免不同环境下Maven默认插件版本不一致导致的问题。
额外提示
如果父项目本身也需要把这两个文件打包进自己的JAR,这个配置同样有效——父项目构建时${project.parent.basedir}会指向自身目录,相当于复制自己的文件到META-INF,完全兼容。
内容的提问来源于stack exchange,提问作者jeff porter
相关产品推荐
相关产品推荐

