Maven:复制文件而无需子目录结构

29

我正在尝试使用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

我认为我在这里发布的答案:https://dev59.com/tWbWa4cB1Zd3GeqPaMN4#72187373 可能会有所帮助。而且它只使用了Maven完成。 - Felipe Mosso
2个回答

25

我自己也曾一次又一次地撞上那个限制。

基本上:我认为没有仅使用Maven的解决方案。您将不得不求助于像这样的动态工具:

<copy todir="${project.basedir}/schemas-target" flatten="true">
    <fileset dir="${project.basedir}/schemas-source">
        <include name="**/*.xsd"/>
    </fileset>
</copy>
  • GMaven插件 允许你从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"属性可以解决问题。 - Guido
    不幸的是,antrun插件是我能够执行类似任务的唯一方法...看起来“flatten”应该作为maven-resources插件的copy-resources目标中的一个设置被包含进去。 - JCD
    flatten只是一个开始,但通常我想设置一个“起始路径”,就像我展开WAR存档时,我可能想要丢失web-inf/classes但保留包结构。但我猜可以使用映射器来实现:http://ant.apache.org/manual/Types/mapper.html - Sean Patrick Floyd
    您也可以使用 move 代替 copy,这样可以同时删除源目录/文件。 - Kenston Choi

    13

    有一种方法......但它真的很单调和繁琐。只有在您想完全采用Maven时才要实现它。Sean的答案是最简单的解决方案。

    问题在于,您必须指定每个目录,然后使用通配符来处理其内部的文件。

    <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>
    


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接