如何通过Maven Assembly为Shell脚本设置可执行权限?
问题:Maven Assembly插件设置Shell脚本权限不生效
我想给{project.basedir}/src/deb/init目录下的Shell脚本设置可执行权限,而且不想把它们打包到其他目录。我已经添加了对应的assembly配置和pom.xml插件配置,但解压生成的Debian包后,文件权限还是-rw-r--r--,请问我的assembly配置哪里错了?遗漏了什么?
我的Assembly配置文件(default.xml,与pom.xml同级)
<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"> <id/> <fileSets> <fileSet> <useDefaultExcludes/> <includes><include>*.sh</include></includes> <excludes/> <fileMode>0755</fileMode> <directoryMode/> <directory>${project.basedir}/src/deb/init</directory> <lineEnding/> <filtered/> </fileSet> </fileSets> </assembly>
pom.xml中的插件配置
<plugin> <!-- Assembly Plugin for the win! --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2</version> <configuration> <descriptors> <descriptor>default.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
问题分析与解决方案
你的配置存在几个关键问题,我帮你逐一梳理并给出修正方案:
1. 插件版本过于陈旧
你使用的maven-assembly-plugin 2.2是2010年的老版本,存在不少已知的权限处理bug,对文件模式的解析和应用逻辑不够可靠。建议直接升级到最新稳定版本(比如3.6.0),新版本对权限的处理更精准。
2. 缺失关键配置的显式声明
<directoryMode/>是空值:虽然不直接影响文件权限,但显式设置为0755可以确保目录本身权限正确,避免后续文件权限继承出现异常。<filtered/>是空值:如果项目全局开启了资源过滤,可能会覆盖这个默认false的设置,导致文件被过滤处理时权限被重置。显式设置<filtered>false</filtered>能保证文件原有的权限和内容不被修改。<useDefaultExcludes/>没有显式赋值:虽然默认是true,但显式声明能避免潜在的配置歧义。
3. 路径写法可以更稳妥
${project.basedir}/src/deb/init可以简化为相对路径src/deb/init,因为插件默认会基于项目根目录解析路径,这样更简洁且不易出错。
修正后的Assembly配置
<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"> <id/> <fileSets> <fileSet> <useDefaultExcludes>true</useDefaultExcludes> <includes> <include>*.sh</include> </includes> <directory>src/deb/init</directory> <fileMode>0755</fileMode> <directoryMode>0755</directoryMode> <filtered>false</filtered> </fileSet> </fileSets> </assembly>
修正后的pom.xml插件配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptors> <descriptor>default.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
验证步骤
- 执行
mvn clean package重新构建项目 - 解压生成的Debian包,检查
ms-media.sh的权限是否变为-rwxr-xr-x - 如果问题依旧,查看Maven构建日志中
assembly相关的输出,确认文件集是否被正确匹配和处理
内容的提问来源于stack exchange,提问作者Harshana
相关产品推荐
相关产品推荐

