1

我正在使用 maven-assembly-plugin 来打包我的构建。

我能够执行一些文件集的复制并很好地修改文件权限,但我无法修改目录权限。从文档中,我尝试在我关心的目录上使用。但是,无论我指定什么权限,目录总是基于当前的 umask (0022) 创建的。有谁知道在 Maven 构建期间以这种方式修改目录权限的干净方法。唯一有效的是umask 0,但我宁愿不要被迫这样做,因为从事这个项目的每个人都必须拥有这套。

示例 Maven 程序集.xml:

<?xml version="1.0"?>
<assembly>
  <id>zip-with-dependencies</id>
  <formats>
    <format>dir</format>
    <format>tar.gz</format>
  </formats>
  <includeBaseDirectory>true</includeBaseDirectory>

  <dependencySets>
    <dependencySet>
      <includes>
        <include>foo:bar</include>
      </includes>
      <outputDirectory>/resources/blah</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>

  <fileSets>
    <fileSet>
      <directory>${basedir}/src/main/web</directory>
      <includes>
        <include>some_dir</include>
      </includes>
      <outputDirectory>web</outputDirectory>
      <fileMode>0777</fileMode>
      <directoryMode>0777</directoryMode>
    </fileSet>
  </fileSets>
</assembly>
4

3 回答 3

3

我有同样的问题。我测试了上述所有解决方案,但没有一个对我有用。我想到并且对我有用的最佳解决方案是在实际写入之前将这些父文件夹预先创建为空文件夹。

因此,要与原始问题相关,您应该使用:

<fileSet>
    <directory>./</directory>
    <outputDirectory>/resources</outputDirectory>
    <excludes>
        <exclude>*/**</exclude>
    </excludes>
    <directoryMode>0700</directoryMode>
</fileSet>

这应该放在示例中资源子文件夹的实际副本之前。

./ - 只是一些现有的文件夹。它可以是任何其他文件夹,只要它存在即可。请注意,我们从 fileSet 中排除任何文件。所以结果将是一个具有适当权限集的空文件夹。

附带说明一下,使用 tar 打包文件的人,如果没有此设置,则 tar 文件将没有为此父文件夹设置的权限。因此提取将产生一个新文件夹,但具有提取用户的权限 + 他的 umask。

当然,0700 仅用于示例。

于 2015-06-03T10:16:47.707 回答
2

我通过结合 pom.xml 和程序集描述符中的设置解决了这个问题。

在 pom 中指定整个 zip 文件的默认值。

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.2</version>

            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>

                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>

            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/descriptor.xml</descriptor>
                </descriptors>
                <archiverConfig>
                    <directoryMode>0755</directoryMode>
                    <defaultDirectoryMode>0755</defaultDirectoryMode>
                    <fileMode>0644</fileMode>
                </archiverConfig>
            </configuration>
        </plugin>

然后在程序集描述符中,我为不应具有默认权限的单个文件夹提供覆盖。

<fileSets>
    <fileSet>
        <directory>src/conf</directory>
        <outputDirectory>conf</outputDirectory>
        <fileMode>0600</fileMode>
        <directoryMode>0700</directoryMode>
    </fileSet>
    <fileSet>
        <directory>src/db</directory>
        <outputDirectory>db</outputDirectory>
    </fileSet>
    <fileSet>
        <directory>src/bin</directory>
        <outputDirectory>bin</outputDirectory>
        <fileMode>0755</fileMode>
    </fileSet>

在这里,目录中的bin文件将为所有用户赋予可执行状态。目录和其中的conf文件只有所有者才能访问,并且db目录继承了 pom.xml 中设置的权限。

程序集文件设置在http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html中描述

除了 amra 发现的 JIRA 问题之外,我在配置部分找不到任何官方文档。

于 2015-03-06T13:23:21.757 回答
1

我发现了一个描述这种行为的JIRA 问题。解决方法应该是

<configuration>
    <archiverConfig>
        <fileMode>420</fileMode> <!-- 420(dec) = 644(oct) -->
        <directoryMode>493</directoryMode> <!-- 493(dec) = 755(oct) -->
        <defaultDirectoryMode>493</defaultDirectoryMode>
    </archiverConfig>
</configuration>
于 2011-09-20T16:07:53.993 回答