Maven双源码目录优先级配置问题:编译重复类错误解决
解决Maven Profile编译双源码目录重复类问题
问题原因
直接用build-helper-maven-plugin把src/main/java和src/main/java2都加入编译路径时,Maven会将两个目录下的所有Java文件都提交给编译器。当存在同包同名的类文件时,编译器无法区分优先级,只会判定为重复类定义,从而抛出error: duplicate class错误。
解决方案
方案一:合并源码目录(推荐,自动处理覆盖)
通过maven-resources-plugin在编译前将两个目录的源码合并到临时目录,让src/main/java2的文件优先保留(覆盖同名文件),再编译合并后的目录。这种方式不会修改原源码目录,且自动处理重复文件。
具体Profile配置:
<profile> <id>second-branch</id> <build> <plugins> <!-- 合并源码到临时目录:先复制java2的文件,再复制java的文件且不覆盖已存在的内容 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <executions> <!-- 第一步:复制java2的文件到临时目录 --> <execution> <id>copy-java2-to-merged</id> <phase>generate-sources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/merged-src/main/java</outputDirectory> <resources> <resource> <directory>src/main/java2</directory> <filtering>false</filtering> </resource> </resources> </configuration> </execution> <!-- 第二步:复制java的文件到临时目录,不覆盖已存在的文件(即java2的文件保留) --> <execution> <id>copy-java-to-merged</id> <phase>generate-sources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/merged-src/main/java</outputDirectory> <resources> <resource> <directory>src/main/java</directory> <filtering>false</filtering> </resource> </resources> <overwrite>false</overwrite> </configuration> </execution> </executions> </plugin> <!-- 指定编译器使用合并后的临时目录作为源码目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <sourceDirectory>${project.build.directory}/merged-src/main/java</sourceDirectory> </configuration> </plugin> </plugins> </build> </profile>
方案二:手动排除重复类(适合重复文件少的场景)
如果重复类数量不多,可以直接在maven-compiler-plugin中指定两个源码目录,并手动排除src/main/java中与src/main/java2重复的类文件。
配置示例:
<profile> <id>second-branch</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <!-- 先指定java2,再指定java,配合排除重复类 --> <compileSourceRoots> <compileSourceRoot>src/main/java2</compileSourceRoot> <compileSourceRoot>src/main/java</compileSourceRoot> </compileSourceRoots> <excludes> <!-- 手动列出src/main/java中与java2重复的类 --> <exclude>com/example/YourDuplicateClass.java</exclude> <exclude>com/example/AnotherDuplicate.java</exclude> </excludes> </configuration> </plugin> </plugins> </build> </profile>
注意:这种方式需要手动维护排除列表,当src/main/java2中的文件变更时,需要同步更新排除项,灵活性较差。
内容的提问来源于stack exchange,提问作者luca.vercelli
相关产品推荐
相关产品推荐

