如何在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
相关产品推荐
相关产品推荐

