You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

exec-maven-plugin生成的源码包与编译包内容一致,疑问阶段配置是否正确

问题分析与解决方案

让我来帮你拆解下这个问题:你现在遇到两个tar.gz工件内容完全相同的情况,先聊聊你关心的阶段选择问题,再排查核心原因。

关于阶段选择的合理性

首先,源码包(sources)的生成和打包,绑定到generate-sources或者process-sources阶段是完全正确的——这个阶段的设计初衷就是用来生成项目的额外源码;而编译产物包(compiled)绑定到compile阶段之后、package阶段之前也没问题。所以阶段选择本身不是导致两个包内容一致的原因,问题出在你的exec执行逻辑或者打包环节的路径区分上。

为什么两个tar包内容会一模一样?

看你的exec-maven-plugin配置:

  1. make-sources环节在generate-sources阶段,工作目录是${basedir}/target-sources,传了is_source=1参数
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:38:06