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?
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.
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.
Use Maven filter option for this. Find the usage in the following link Maven Filter