Подтвердить что ты не робот

Maven: копировать файлы без структуры подкаталога

Я пытаюсь использовать 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
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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