Maven:复制没有子目录结构的文件

Posted

技术标签:

【中文标题】Maven:复制没有子目录结构的文件【英文标题】:Maven : copy files without subdirectory structure 【发布时间】:2010-11-23 15:43:58 【问题描述】:

我正在尝试使用 Maven 将给定文件夹中包含的所有 *.xsd 文件移动到另一个文件夹,但没有源子目录结构。

这是我目前所拥有的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <id>move-schemas</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>resources</goal>
            </goals>
            <configuration>
                <outputDirectory>$basedir/schemas-target</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

...

<resources>
    <resource>
        <directory>$basedir/schemas-source</directory>
        <includes>
            <include>**/*.xsd</include>
        </includes>
    </resource>
</resources>

而且它(几乎)正在工作。唯一的问题是它保留了源子目录结构,而我需要删除该层次结构并将所有 xsd 文件放在目标文件夹中。示例:

这是我在 schemas-source 文件夹中的内容:

schemas-source
 │- current
 │    │- 0.3
 │        │- myfile.xsd
 │- old
      │- 0.2
          │- myfile-0.2.xsd

这就是我在 schemas-target 文件夹中所需要的:

schemas-target
 │- myfile.xsd
 │- myfile-0.2.xsd

【问题讨论】:

【参考方案1】:

我自己一次又一次地反对这个限制。

基本上:我认为没有唯一的 Maven 解决方案。您将不得不求助于使用动态的东西,例如

Maven Antrun Plugin 在 maven 中嵌入 ant 任务,在本例中为 ant copy task,如下所示:

<copy todir="$project.basedir/schemas-target" flatten="true">
    <fileset dir="$project.basedir/schemas-source">
        <include name="**/*.xsd"/>
    </fileset>
</copy>

GMaven plugin 让您从 pom 中执行 Groovy 代码,如下所示:

new File(pom.basedir, 'schemas-source').eachFileRecurse(FileType.FILES)
    if(it.name.endsWith('.xsd'))
        new File(pom.basedir, 'schemas-target/$it.name').text = it.text;
    

【讨论】:

谢谢,我尝试了 Maven Antrun 插件,但我不知道 flattern="true" 属性可以解决问题。 不幸的是,antrun 插件是我能够执行类似任务的唯一方法......似乎“扁平化”应该作为设置包含在 maven-resources 的复制资源目标中插件。 扁平化是一个开始,但我经常想设置一个“开始路径”,就像我扩展 WAR 存档时一样,我可能想丢失 web-inf/classes 但保留包结构。但我想这可以使用映射器来实现:ant.apache.org/manual/Types/mapper.html 您也可以使用move 而不是copy,这也应该删除源目录/文件。【参考方案2】:

有一种方法..它真的很单调和麻烦。仅当您想完全成熟时才实施它。肖恩的回答是最简单的解决方案。

问题是你必须指定每个目录,然后对里面的文件使用通配符。

<execution>
<id>copy-jars</id>
<phase>process-sources</phase>
<goals>
    <goal>copy-resources</goal>
</goals>
<configuration>
    <outputDirectory>$basedir/target/classes</outputDirectory>
    <resources>
        <resource>
            <directory>$basedir/resources</directory>
            <includes>
                <include>xyz.jar</include>
            </includes>
        </resource>     
        <resource>
            <directory>$basedir/as-u-like-it</directory>
            <includes>
                <include>abc.jar</include>
            </includes>
        </resource>     
</configuration>

【讨论】:

以上是关于Maven:复制没有子目录结构的文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥我新建的maven工程没有resources目录

阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_07maven常用命令

为啥新建的maven工程没有resources目录?

sh 复制目录结构,没有文件

maven的项目结构

Maven