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

如何通过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>

验证步骤

  1. 执行mvn clean package重新构建项目
  2. 解压生成的Debian包,检查ms-media.sh的权限是否变为-rwxr-xr-x
  3. 如果问题依旧,查看Maven构建日志中assembly相关的输出,确认文件集是否被正确匹配和处理

内容的提问来源于stack exchange,提问作者Harshana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:33