保持对具有 Maven 资源的文件的权限:testResources

Posted

技术标签:

【中文标题】保持对具有 Maven 资源的文件的权限:testResources【英文标题】:Keep permissions on files with Maven resources:testResources 【发布时间】:2011-09-25 03:43:01 【问题描述】:

是否可以使用 Maven 资源:testResources 保留文件权限?我的用例是一个 Selenium 二进制驱动程序,我将它放在 /src/test/resources 中,我希望能够从我的测试中使用它。然而,我的 -rwxr-xr-x 在目标/测试类中更改为 -rw-r--r--

【问题讨论】:

【参考方案1】:

这似乎是bug in the Maven Resource Plugin

如果你使用的是 Maven Assembly Plugin,你可以在那里配置file permissions。

如果没有,您可能会考虑一种解决方法。您可以通过 Ant 执行以下操作:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>process-test-classes</id>
            <phase>process-test-classes</phase>
            <configuration>
                <target>
                    <chmod file="target/test-classes/test.sh" perm="755"/>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【讨论】:

谢谢!非常快速的回答和解决方法现在对我来说已经足够了。 Maven 资源插件仍然“忘记”文件的权限 :-( 有比使用 ant 更好的方法吗? 五年后bug仍未修复:issues.apache.org/jira/browse/MRESOURCES-132 更糟糕的是,它被错误地关闭-重新打开-关闭了很多次。 这个 bug 终于在 2020 年关闭,maven-resource-plugin 3.2.0+ 按预期工作。多年来一直在等待修复!【参考方案2】:

我添加了一个在 Unix 机器上运行时自动激活的配置文件。它执行一个内嵌 shell 脚本,以递归方式将文件夹中所有文件的文件权限应用于另一个文件夹中的同名文件(请参阅 SRC 和 DST 变量)。该脚本需要/bin/sh 以及findxargschmod,它们应该存在于所有现代系统中。

    <profile>
        <id>unix</id>
        <activation>
            <os>
                <family>unix</family>
            </os>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>fix-resource-permissions</id>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                            <phase>process-test-resources</phase>
                            <configuration>
                                <executable>/bin/sh</executable>
                                <arguments>
                                    <argument>-c</argument>
                                    <argument>
                                        set -x

                                        SRC="$basedir/src/test/resources"
                                        DST="$project.build.directory/test-classes"

                                        find "$$SRC" -printf "%P\0" | xargs --verbose -0 -I  chmod --reference="$$SRC/" -f "$$DST/"
                                    </argument>
                                </arguments>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

【讨论】:

【参考方案3】:

我的解决方案是以不介意标志的方式执行脚本。因此,例如,当从 Maven Exec 插件运行时,我使用:

之前:

<executable>myScript.sh</executable>
<commandlineArgs>...</commandlineArgs>

之后:

<executable>bash</executable>
<commandlineArgs>myScript.sh ...</commandlineArgs>

注意:如果你使用bash -c,如果exec标志是关闭的,它也会失败。


添加来自 Maven 的创建者之一 Jason van Zyl 的评论:

maven-resources-plugin 从未打算创建任何可在裸文件系统中使用的资源。它严格地打算将资源放入生成的工件中,以便以独立于平台的方式使用,通常来自类路径。如果您想移动将要解包和使用的档案,我建议您使用程序集插件来制作档案,并使用依赖插件来解包它们。

http://maven.40175.n5.nabble.com/maven-resources-plugin-not-retaining-unix-permissions-td4938002.html

【讨论】:

以上是关于保持对具有 Maven 资源的文件的权限:testResources的主要内容,如果未能解决你的问题,请参考以下文章

Linux权限管理

【Linux】Linux文件权限 r,w,x,S,T

maven web工程缺少 src/main/java 和 src/test/java 资源文件夹的方法

HTTP session保持简单示例

对Maven 工程还不了解 那你就out了!

权限管理