Copying multiple resource directories to independent target directories with maven

JavaMaven

Java Problem Overview


The Maven resources plugin:

> This goal requires that you configure the resources to be copied, and specify the outputDirectory.

Copy two (or more) external resource directories within the basedir to the build output directory using maven (see blah and uggh).

${basedir}/ 
  - pom.xml
  - blah/
  - uggh/
  - src/
    - main/..
    - test/..
  - target/
    - classes/..
    - blah/
    - uggh/

For example, given the directory structure above copy blah and uggh to the target directory using maven. It is easy to copy one or the other, however, the plugin only accepts a single outputDirectory. If you specify the target directory and both directories as resources, then the contents of each directory gets copied to target but not the directories themselves.

Additional use of the plugin overwrites the initial. Also, I've tried specifying the entire basedir and only including the desired directories. This does not copy anything.

Here is an example of copying a single directory:

  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>copy-resources</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>${basedir}/target/blah</outputDirectory>
          <resources>
            <resource>
                <directory>blah</directory>
                <filtering>true</filtering>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>

Java Solutions


Solution 1 - Java

This is where the file ends up:

<outputDirectory>${basedir}/target/blah</outputDirectory>

This is where it is copied from:

<directory>src/main/otherresources</directory>

There would be an <include> or <includes> tag to tell the file name(s)

Multiples

You need multiple <execution>s with different <id>s for multiple folders:

  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>copy-resources-1</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>${basedir}/target/blah</outputDirectory>
          <resources>
            <resource>
                <directory>blah</directory>
                <filtering>true</filtering>
            </resource>
          </resources>
        </configuration>
      </execution>
      <execution>
        <id>copy-resources-2</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>${basedir}/target/ughh</outputDirectory>
          <resources>
            <resource>
                <directory>ughh</directory>
                <filtering>true</filtering>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>

Solution 2 - Java

For me this one works well in Maven 3:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <executions>
                <execution>
                    <id>custom-resources</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}</outputDirectory>
                        <resources>                                        
                            <resource>
                                <targetPath>${basedir}/target/blah</targetPath>
                                <directory>blah</directory>
                                <filtering>true</filtering>
                            </resource>				
                            <resource>
                                <targetPath>${basedir}/target/uggh</targetPath>
                                <directory>uggh</directory>
                                <filtering>false</filtering>
                            </resource>	             
                        <encoding>UTF-8</encoding>
                    </configuration>            
                </execution>
            </executions>
        </plugin>

Solution 3 - Java

This is the simpler solution I've found and it's working...

<build>
    <plugins>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <configuration>   
            </configuration>
        </plugin>
    </plugins> 
    <resources>
        <resource>
            <directory>${basedir}/src/main/java/org/mc2/mymusic/gui/main/Menu/resources</directory>
            <targetPath>${basedir}/target/classes/org/mc2/mymusic/gui/main/Menu/resources</targetPath>
            <filtering>false</filtering>
        </resource>
    </resources>  
</build>

Solution 4 - Java

You can use ant-style patterns

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.7</version>
    <executions>
        <execution>
    	    <id>copy-resources</id>
    	    <phase>validate</phase>
    	    <goals>
    	        <goal>copy-resources</goal>
    	    </goals>
    	    <configuration>
    	        <outputDirectory>${project.build.directory}</outputDirectory>
    	        <resources>
    	            <resource>
    	        	    <directory>${basedir}</directory>
    	        	    <includes>
    	        	        <include>blah/**</include>
    	        	        <include>uggh/**</include>
    	        	    </includes>
    	            </resource>
    	        </resources>
    	    </configuration>
    	</execution>
    </executions>
</plugin>

Solution 5 - Java

    <resources>
        <resource>
              <directory>${basedir}/src/scripts</directory>
              <includes>
                  <include>data-octopus.ps1</include>
              </includes>
              <targetPath>${basedir}/target/data</targetPath>
        </resource>
        <resource>
              <directory>${basedir}/src/scripts</directory>
              <includes>
                  <include>service-octopus.ps1</include>
              </includes>
              <targetPath>${basedir}/target/service</targetPath>
        </resource>
    </resources>

    </plugins>
        ...
    </plugins>

Solution 6 - Java

Reading your example I don't think you have to include&configure the maven-resource-plugin. Just add those resource-elements to the <build><resources/>-tag. See http://maven.apache.org/ref/3.1.1/maven-model/maven.html#class_resource which other tags you can use.

Solution 7 - Java

Maven hides everything to make it easier to code. There are several ways you can achieve this.

  1. Edit the default execution in Resources plugin. (Easiest) This also can be written using include tag or different resources
  2. Write different executions in Resources plugin.
  3. Use Antrun plugin. (You might as well write the whole build in ant)
  4. Maven Copy-rename plugin.
  5. And many other ways that I am not mentioning here....

Edit the default plugin--

<resources>
	<resource>
		<directory>${basedir}<directory>
		<includes>
			<include>blah</include>
			<include>ughh</include>
		</includes>
	<resource>
<resources>
<plugins>
	<plugin>
		<artifactId>maven-resources-plugin</artifactId>
		<configuration>
			<outputDirectory>${basedir}/target</outputDirectory>
		</configuration>
	</plugin>
</plugins>

Solution 8 - Java

If you want to copy more directories or files - a better option:

  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>copy-resources</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <tasks>
            <copy todir="${basedir}/target/blah" overwrite="true">
                 <fileset dir="blah"/>
            </copy>
            <copy file="${basedir}/target/blah/somefile"
                  todir="../target_webapp_eclaims/WEB-INF" overwrite="true"/>
          </tasks>
        </configuration>
      </execution>
    </executions>
  </plugin>

Solution 9 - Java

		<resources>
		  <resource>
			<directory>src/main/resources</directory>
			<filtering>false</filtering>
			<targetPath>${basedir}/target</targetPath>
    	  </resource>
		  <resource>
			<directory>src/main/resources</directory>
			<filtering>false</filtering>
			<targetPath>${basedir}/target/classes</targetPath>
		  </resource>
	   </resources>

	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.6.1</version>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-resources-plugin</artifactId>
			<version>3.0.2</version>
			<configuration>
				<nonFilteredFileExtensions>
					<nonFilteredFileExtension>jks</nonFilteredFileExtension>
				</nonFilteredFileExtensions>
				<executions>
					<execution>
						<id>copy-resources-1</id>
						<phase>validate</phase>
						<goals>
							<goal>copy-resources</goal>
						</goals>
					</execution>
				</executions>
			</configuration>
		</plugin>
   </plugins>

Maven - Copying resources into multiple targets

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbnjmnView Question on Stackoverflow
Solution 1 - JavaLee MeadorView Answer on Stackoverflow
Solution 2 - JavaBoris BiryuchkovView Answer on Stackoverflow
Solution 3 - JavaMarcoc1712View Answer on Stackoverflow
Solution 4 - JavaRicardo VelosoView Answer on Stackoverflow
Solution 5 - Javahit3kView Answer on Stackoverflow
Solution 6 - JavaRobert ScholteView Answer on Stackoverflow
Solution 7 - JavaPrabhuView Answer on Stackoverflow
Solution 8 - JavaOleksandr BondarchukView Answer on Stackoverflow
Solution 9 - JavaFelix AballiView Answer on Stackoverflow