Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace a Source file in maven compile

Tags:

maven-2

I have to replace a Java source file during maven compile if a special profile is active. I thought about just excluding the file from the standard src/main/java/ and including it from another source directory like src/main/java2/.

But since the files have to have the same name and package the exclude always wins and the file from the other directory gets never included...

Any known working way to do that?

like image 766
Marko Avatar asked Dec 05 '25 00:12

Marko


2 Answers

I would use the Maven Antrun Plugin to rename the "original" source file and copy the "special" source file from src/main/java2 to src/main/java before the compile phase. After compile, restore the original source file. Something like that (put that in the profile):

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.4</version>
  <executions>
    <execution>
      <id>replace-source-file</id>
      <phase>process-sources</phase>
      <configuration>
        <tasks>
          <move file="src/main/java/com/stackoverflow/App.java" tofile="src/main/java/com/stackoverflow/App.java.moved"/>
          <copy file="src/main/java2/com/stackoverflow/App.java" todir="src/main/java/com/stackoverflow/"/>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
    <execution>
      <id>restore-source-file</id>
      <phase>compile</phase>
      <configuration>
        <tasks>
          <move file="src/main/java/com/stackoverflow/App.java.moved" tofile="src/main/java/com/stackoverflow/App.java"/>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Update: As mentioned by the OP in a comment, there is a major drawback with this approach. If there is a compile error the wrong source file (and the *.java.moved file) stays in the src/main/java directory. This is a problem.

A cleaner alternative would be to move both versions of the source in dedicated modules and to declare one or the other module as dependency depending on the profile (the normal artifact would be included in a profile active by default). I wouldn't even mess with compiler exclusions. This would work and is clean.

like image 193
Pascal Thivent Avatar answered Dec 08 '25 03:12

Pascal Thivent


One possible solution would be to copy the source files you actually need into some temporary directory like /target/temp/src before executing the compile phase. Include only that directory as your source directory.

like image 35
xor_eq Avatar answered Dec 08 '25 04:12

xor_eq



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!