Maven: копировать файлы без структуры подкаталогов - PullRequest
25 голосов
/ 23 ноября 2010

Я пытаюсь с помощью 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
 │- current
 │    │- 0.3
 │        │- myfile.xsd
 │- old
      │- 0.2
          │- myfile-0.2.xsd

, и это то, что мне нужно в папке схемы-цели:

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

Ответы [ 2 ]

24 голосов
/ 23 ноября 2010

Я ударился головой об это ограничение сам, снова и снова.

В принципе: я не думаю, что есть решение только для maven.Вам придется прибегнуть к использованию чего-то динамического, такого как

  • Плагин Maven Antrun
    Внедрение задач муравья в Maven, в данном случае копия муравьязадача , что-то вроде этого:

    <copy todir="${project.basedir}/schemas-target" flatten="true">
        <fileset dir="${project.basedir}/schemas-source">
            <include name="**/*.xsd"/>
        </fileset>
    </copy>
    
  • Плагин GMaven Позволяет выполнять Groovy-код из pom, что-то вроде этого:

    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;
        }
    }
    
12 голосов
/ 06 января 2012

Есть способ ... и его действительно однообразный и громоздкий.Реализуйте это, только если вы хотите быть полностью придуманным.Ответ Шона - самое простое решение.

Проблема в том, что вы должны указать каждый каталог, а затем использовать подстановочные знаки для файлов внутри.

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

...