wmorrell
wmorrell

Reputation: 5307

Renaming resources in Maven

I am trying to find a way to copy a resource file to a new name in the target directory in a Maven build. Pretty much everything I have found while searching suggests workarounds involving multiple sub-directories in /src/main/resources and selecting among them via profiles. However, in my case, this does not solve the problem, namely that the file I want has a "magic" name.

Basically what I want to do is have a /src/main/resources/default.DS_Store file get copied to ${project.build.directory}/.DS_Store. Since the .DS_Store file has special meaning in Mac OSX, it is not desirable to have a file with that name in the source tree, and in version control. However, I do want the data in the file to be in the source tree and version control, and have it renamed to the "magic" name during the build.

I'm starting to think that ant is the only way to do this automatically. Is there any easier way?

Upvotes: 65

Views: 101543

Answers (6)

0xdeadbeef
0xdeadbeef

Reputation: 3

Here's an example how to conveniently rename files and also find and replace content using regex, using the maven ant run plugin:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
    <execution>
        <id>default-cli</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>run</goal>
        </goals>
        <configuration>
            <failOnError>false</failOnError>
            <target>
                <!-- rename files -->
                <move file="${basedir}/src/main/java/com/example/example.java"
                        tofile="${basedir}/src/main/java/com/example/example_new_name.java" />

                <!-- rename content -->
                <replaceregexp file="${basedir}/src/main/java/com/example/example_new_name.java"
                                match="OldStr" replace="NewStr" flags="g" />
            </target>
        </configuration>
    </execution>
</executions>

You can define multiple "move" tags. It's a well maintained project from Apache.

Upvotes: 0

Benoit Courtine
Benoit Courtine

Reputation: 7064

I see 2 options to solve your problem:

Upvotes: 17

P-A
P-A

Reputation: 1278

I had the same problem using the copy-rename-maven-plugin solved my problem

    <project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>com.coderplus.maven.plugins</groupId>
        <artifactId>copy-rename-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>copy-file</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
              <destinationFile>target/someDir/environment.properties</destinationFile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Upvotes: 20

coderplus
coderplus

Reputation: 5913

Using the antrun-maven-plugin makes it easy, but in case you are looking for a more mavenish way which is supported within eclipse m2e, then you can use the copy-rename-maven-plugin

  <plugin>
    <groupId>com.coderplus.maven.plugins</groupId>
    <artifactId>copy-rename-maven-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
      <execution>
        <id>rename-file</id>
        <phase>compile</phase>
        <goals>
          <goal>rename</goal>
        </goals>
        <configuration>
          <sourceFile>${project.build.outputDirectory}/default.DS_Store</sourceFile>
          <destinationFile>${project.build.outputDirectory}/.DS_Store</destinationFile>
        </configuration>
      </execution>
    </executions>
  </plugin>

And in case you have any feedback/issues with the plugin, you can reach out at https://github.com/coderplus/copy-rename-maven-plugin/

Upvotes: 44

rob2universe
rob2universe

Reputation: 7583

Example usage of the assembly plugin to copy and/or rename a file:

pom file:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
   <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.1</version>
        <configuration>
          <descriptors>
            <descriptor>src/main/descriptors/example.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Descriptor file:

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
       <id>example</id>
       <formats>
              <format>dir</format>
       </formats>
       <files>
              <file>
                     <source>src/main/resources/something.properties</source>
                     <outputDirectory>/</outputDirectory>
                     <destName>something.properties</destName>
              </file>
              <file>
                     <source>src/main/resources/something.properties</source>
                     <outputDirectory>/</outputDirectory>
                     <destName>something_en.properties</destName>
              </file>
       </files>
</assembly>

Upvotes: 23

jgifford25
jgifford25

Reputation: 2154

You can avoid the over head of Ant by using the Maven Assembly plugin and the file assembly descriptor.

Upvotes: 14

Related Questions