代码之家  ›  专栏  ›  技术社区  ›  Guido

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

  •  25
  • Guido  · 技术社区  · 14 年前

    我试图使用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目标文件夹中需要的:

    schemas-target
     │- myfile.xsd
     │- myfile-0.2.xsd
    
    2 回复  |  直到 9 年前
        1
  •  24
  •   Sean Patrick Floyd    14 年前

    我自己一次又一次地把头撞到那个限制上。

    基本上:我认为没有一个唯一的解决方案。你将不得不使用像

    • 这个 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;
          }
      }
      
        2
  •  12
  •   Keerthi Ramalingam    13 年前

    有办法。。而且非常单调和繁琐。只有当你想完全独立的时候才能实现它。肖恩的回答是最简单的解决办法。

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

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