exec-maven-plugin生成的源码包与编译包内容一致,疑问阶段配置是否正确
让我来帮你拆解下这个问题:你现在遇到两个tar.gz工件内容完全相同的情况,先聊聊你关心的阶段选择问题,再排查核心原因。
关于阶段选择的合理性
首先,源码包(sources)的生成和打包,绑定到generate-sources或者process-sources阶段是完全正确的——这个阶段的设计初衷就是用来生成项目的额外源码;而编译产物包(compiled)绑定到compile阶段之后、package阶段之前也没问题。所以阶段选择本身不是导致两个包内容一致的原因,问题出在你的exec执行逻辑或者打包环节的路径区分上。
为什么两个tar包内容会一模一样?
看你的exec-maven-plugin配置:
make-sources环节在generate-sources阶段,工作目录是${basedir}/target-sources,传了is_source=1参数make-compiled环节在compile阶段,工作目录是${basedir}/target,传了is_source=0参数
但最后你用build-helper附加的两个tar包,分别来自target和target-sources目录。这里大概率是你的makecode工具没有正确区分输出:
- 要么
is_source=1时,工具没有把源码文件输出到target-sources目录,而是默认输出到了target; - 要么后续打包的时候,不小心把同一个目录的内容打包了两次;
- 还有可能
makecode工具的is_source参数没有起到预期的作用,不管传1还是0,输出的内容都是一样的。
另外,build-helper-maven-plugin在package阶段执行attach-artifact是合理的——这个阶段本来就是用来处理项目打包和附加工件的,只要两个tar.gz文件在package阶段执行前已经被正确生成,就没有问题。
具体修复建议
1. 先确认makecode工具的输出是否正确
在Jenkins构建时,添加日志输出(比如在exec配置里加<outputFile>或者直接查看控制台日志),看看makecode执行时:
- 当
is_source=1时,是否真的在target-sources目录下生成了预期的源码文件; - 当
is_source=0时,是否在target目录下生成了混淆/编译后的文件。
如果工具本身输出路径不对,那后续打包肯定会出问题。
2. 确保打包逻辑完全隔离
如果是makecode工具直接生成tar.gz,要确保两个执行环节生成的tar.gz路径或文件名完全区分开;如果是用其他插件(比如maven-assembly-plugin)打包,要分别针对target-sources和target目录配置不同的打包规则。
举个用maven-assembly-plugin拆分打包的例子,这样能明确区分两个包的内容:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <!-- 专门打包源码包 --> <execution> <id>package-sources</id> <phase>generate-sources</phase> <goals> <goal>single</goal> </goals> <configuration> <!-- 这个描述符里定义要打包target-sources下的源码文件 --> <descriptors> <descriptor>src/main/assembly/sources.xml</descriptor> </descriptors> <finalName>product-${project.version}-sources</finalName> <outputDirectory>${basedir}/target-sources</outputDirectory> </configuration> </execution> <!-- 专门打包编译产物包 --> <execution> <id>package-compiled</id> <phase>compile</phase> <goals> <goal>single</goal> </goals> <configuration> <!-- 这个描述符里定义要打包target下的编译产物 --> <descriptors> <descriptor>src/main/assembly/compiled.xml</descriptor> </descriptors> <finalName>product-${project.version}-compiled</finalName> <outputDirectory>${basedir}/target</outputDirectory> </configuration> </execution> </executions> </plugin>
3. 验证文件路径是否正确
在Jenkins构建完成后,手动查看target和target-sources目录下的tar.gz文件内容,确认它们确实不同——如果本地查看就已经相同,那就是生成环节的问题,和build-helper无关。
总结
阶段选择上,源码相关的操作放在generate-sources阶段、编译产物放在compile阶段是完全合理的,核心问题是要确保makecode工具的输出路径和打包逻辑完全隔离,避免两个环节的输出重叠。
内容的提问来源于stack exchange,提问作者Panagiotis

