如果特殊配置文件处于活动状态,我必须在maven compile
期间替换Java源文件。
我想过要从标准src/main/java/
中排除该文件,并将其包含在src/main/java2/
等其他源目录中。
但由于文件必须具有相同的名称和包,因此排除总是获胜,而其他目录中的文件永远不会被包含......
任何已知的工作方式吗?
答案 0 :(得分:5)
我会使用Maven Antrun Plugin重命名“原始”源文件,并在src/main/java2
阶段之前将“特殊”源文件从src/main/java
复制到compile
。在compile
之后,恢复原始源文件。这样的东西(把它放在配置文件中):
<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>
更新:正如OP在评论中所提到的,这种方法存在一个主要缺点。如果存在编译错误,则错误的源文件(以及*.java.moved
文件)将保留在src/main/java
目录中。这是一个问题。
更清晰的替代方法是在专用模块中移动源的两个版本,并根据配置文件将一个或另一个模块声明为依赖项(普通工件将包含在配置文件中默认情况下)。我甚至不会搞乱编译器排除。这样可行并且干净。
答案 1 :(得分:1)
一种可能的解决方案是在执行编译阶段之前将实际需要的源文件复制到某个临时目录,如/target/temp/src
。仅包含该目录作为源目录。
答案 2 :(得分:0)
使用Maven过滤器选项。在以下链接Maven Filter
中查找用法