You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:25:26