Maven : copy files without subdirectory structure

2019-01-17 10:45发布

I am trying to use Maven to move all the *.xsd files contained in a given folder to another one, but without the source subdirectory structure.

This is what I have so far:

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

And it is (almost) working. The only problem is that it keeps the source subdirectory structure, while I need to remove that hierarchy and put all the xsd files in the target folder. Example:

This is what I have in the schemas-source folder:

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

and this is what I'd need in the schemas-target folder:

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

2条回答
Anthone
2楼-- · 2019-01-17 11:06

There is a way.. and its really monotonous and cumbersome. Implement it only if you want to be completely mavenized. Sean's answer is the easiest solution.

The problem is you have to specify each and every directory and then use wild cards for the files inside.

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

查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-01-17 11:20

I banged my head against that restriction myself, again and again.

Basically: I don't think there's a maven only solution. You will have to resort to using something dynamic like

  • The Maven Antrun Plugin
    Embed ant tasks in maven, in this case an ant copy task, something like this:

    <copy todir="${project.basedir}/schemas-target" flatten="true">
        <fileset dir="${project.basedir}/schemas-source">
            <include name="**/*.xsd"/>
        </fileset>
    </copy>
    
  • The GMaven plugin Lets you execute Groovy code from your pom, something like this:

    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;
        }
    }
    
查看更多
登录 后发表回答