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

Gradle项目多Java源码目录关联问题排查与解决

多Java源码目录的Gradle配置问题解决

问题描述

我正在开发一个包含多个Java源码目录的项目,尝试配置Gradle以编译并运行这些目录下的Java文件。当前配置包含两个独立源码目录,希望Gradle能识别并编译这两个目录下的文件,现有配置如下:

plugins {
    id 'java'
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.google.guava:guava:32.1.2-jre'
    implementation 'org.apache.commons:commons-lang3:3.13.0'
    implementation 'org.slf4j:slf4j-api:2.0.9'
    implementation 'com.googlecode.plist:dd-plist:1.26'
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(23)
    }
}

application {
    mainClass = 'test1.test1'  // path to the compiled .class file
}

tasks.named('test') {
    useJUnitPlatform()
}

sourceSets {
    main {
        java {       
            srcDirs = ['C:/vscode/test1/dd-plist-master/src/main/java', 'app/src/main/java']
        }
    }
}

尝试关联的两个Java源码目录为:

  • C:/vscode/test1/dd-plist-master/src/main/java
  • C:/vscode/test1/app/src/main/java

但运行项目时遇到问题,Gradle未能正确识别或关联这两个目录,请问当前配置存在哪些问题,如何正确配置?


当前配置的问题分析

  1. 路径基准混乱:第一个目录用了绝对路径,第二个用了相对路径,Gradle的相对路径基于项目根目录(C:/vscode/test1),混合使用会导致路径解析错误,可能无法找到其中一个目录。
  2. 重复类冲突:你已经在dependencies中引入了com.googlecode.plist:dd-plist:1.26依赖,同时又把该库的源码目录加入源码集,编译时会出现重复类错误——依赖库已提供这些类,再编译源码会引发类定义冲突。
  3. 主类有效性存疑:需要确认test1.test1类确实存在于其中一个源码目录的对应包结构下,否则运行时会找不到主类。

正确配置方案

根据需求分两种场景处理:

场景1:需要自行编译dd-plist源码(如要修改源码逻辑)

  • 移除依赖中的com.googlecode.plist:dd-plist:1.26,避免重复类冲突
  • 统一使用相对路径配置源码目录(假设项目根目录是C:/vscode/test1)
  • 确认主类test1.test1存在于app/src/main/java目录的test1包下

修改后的完整配置:

plugins {
    id 'java'
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.google.guava:guava:32.1.2-jre'
    implementation 'org.apache.commons:commons-lang3:3.13.0'
    implementation 'org.slf4j:slf4j-api:2.0.9'
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(23)
    }
}

application {
    mainClass = 'test1.test1'
}

tasks.named('test') {
    useJUnitPlatform()
}

sourceSets {
    main {
        java {       
            srcDirs = ['dd-plist-master/src/main/java', 'app/src/main/java']
        }
    }
}

场景2:直接使用dd-plist依赖库(无需编译源码)

  • 移除源码集中的dd-plist-master/src/main/java目录,只保留业务代码目录
  • 保留依赖中的com.googlecode.plist:dd-plist:1.26,直接使用库中的类

修改后的完整配置:

plugins {
    id 'java'
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.google.guava:guava:32.1.2-jre'
    implementation 'org.apache.commons:commons-lang3:3.13.0'
    implementation 'org.slf4j:slf4j-api:2.0.9'
    implementation 'com.googlecode.plist:dd-plist:1.26'
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(23)
    }
}

application {
    mainClass = 'test1.test1'
}

tasks.named('test') {
    useJUnitPlatform()
}

sourceSets {
    main {
        java {       
            srcDirs = ['app/src/main/java']
        }
    }
}

验证配置

配置完成后,执行以下Gradle命令验证:

  • 编译项目:./gradlew compileJava(Windows系统用gradlew.bat compileJava)
  • 运行项目:./gradlew run
  • 执行测试:./gradlew test

若编译或运行报错,优先检查:

  • 源码目录的相对路径是否与项目根目录匹配
  • 主类的包名和类名是否完全正确
  • 是否存在其他重复类或缺失依赖的问题

内容的提问来源于stack exchange,提问作者dsHuHsb dsHuHsb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:53:15