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

如何在Maven Assembly中包含所有空目录?Git空目录问题求解决

解决Maven Assembly Plugin在Ubuntu(Jenkins)下不打包空目录的问题

这个问题的核心原因其实很明确:Git不会追踪空目录。你本地Windows环境里的folder3还存在,是因为你没通过Git删除它,但当Jenkins在Ubuntu上拉取代码时,Git不会把空目录同步到服务器上,所以folder3根本不存在,maven-assembly-plugin自然没法把一个不存在的目录打包进去。

下面给你几个实用的解决办法,按推荐程度排序:

方法1:用.gitkeep占位文件(最常用的Git方案)

这是Git生态里约定俗成的技巧,在空目录folder3里创建一个名为.gitkeep的空文件,然后把这个文件提交到Git仓库。这样Git就会追踪这个文件,从而保留folder3目录。

当Jenkins拉取代码后,folder3目录会因为.gitkeep的存在而被创建,maven-assembly-plugin就能正常打包这个目录了。如果你不想在最终打包产物里保留.gitkeep,可以在assembly描述符里添加排除规则:

<fileSet>
  <directory>${project.basedir}/src/main/resources</directory>
  <outputDirectory></outputDirectory>
  <filtered>false</filtered>
  <fileMode>744</fileMode>
  <excludes>
    <exclude>**/.gitkeep</exclude>
  </excludes>
</fileSet>

方法2:在Assembly描述符中显式声明要创建的空目录

修改你的assembly描述符,添加<directories>节点,强制指定要创建的空目录:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <!-- 你的原有fileSet配置 -->
    <fileSet>
      <directory>${project.basedir}/src/main/resources</directory>
      <outputDirectory></outputDirectory>
      <filtered>false</filtered>
      <fileMode>744</fileMode>
    </fileSet>
  </fileSets>
  <!-- 添加这部分,显式创建空目录 -->
  <directories>
    <directory>${project.basedir}/src/main/resources/folder3</directory>
    <outputDirectory>folder3</outputDirectory>
    <!-- 如果需要设置目录权限,可添加directoryMode -->
    <directoryMode>755</directoryMode>
  </directories>
</assembly>

不过要注意:如果Jenkins环境里folder3目录完全不存在,maven-assembly-plugin可能无法直接创建它,这时候可以结合方法3,先让Maven帮你创建目录。

方法3:用Maven AntRun插件提前创建空目录

在你的pom.xml中添加maven-antrun-plugin配置,在打包前自动创建需要的空目录:

<build>
  <plugins>
    <!-- 先添加AntRun插件 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>3.1.0</version>
      <executions>
        <execution>
          <phase>process-resources</phase> <!-- 在资源处理阶段创建目录 -->
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <tasks>
              <!-- 创建空目录 -->
              <mkdir dir="${project.basedir}/src/main/resources/folder3"/>
            </tasks>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <!-- 你的maven-assembly-plugin配置 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.6.0</version>
      <!-- 你的原有配置 -->
    </plugin>
  </plugins>
</build>

这样在Jenkins打包时,AntRun会先创建folder3目录,之后assembly插件就能正常打包它了。


内容的提问来源于stack exchange,提问作者Stéphane GRILLON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:48:05