如何将Gradle子项目源码目录添加到配置及类路径中
Gradle子项目源码路径添加到GWT CodeServer类路径问题
问题背景
需要将子项目的源码路径添加到自定义Gradle配置中,该配置会作为JavaExec任务的类路径,用于运行GWT代码服务器。
此前尝试的所有方案均存在问题:要么路径未被成功加入类路径,要么构建直接报错。
现有实现代码
配置与任务定义
configurations { gwtCodeServer } task runCodeServer(type: JavaExec) { classpath = configurations.gwtCodeServer doFirst { classpath.each { println it} // 此处打印能得到正确路径:[C:/fullpath_to_subproject/src/main/java] println files( project(':subproject.name').sourceSets.main.java.srcDirs ).files } }
已尝试的依赖配置
dependencies { gwtCodeServer files(project.sourceSets.main.java.srcDirs) // 配置正常 gwtCodeServer files(project.sourceSets.main.resources.srcDirs) // 配置正常 gwtCodeServer files('C:/opt/gwt-2.9.0/gwt-codeserver.jar') // 配置正常 // 硬编码子项目路径时配置正常,但灵活性差 gwtCodeServer files('C:/fullpath_to_subproject/src/main/java') // 配置失效:类路径打印结果显示没有任何内容被加入 gwtCodeServer files(project(':subproject.name').sourceSets.main.java.srcDirs) // 配置报错:Cannot convert the provided notation to an object of type Dependency // 虽然单独打印路径结果正确(实际是toString()的输出效果) gwtCodeServer files(project(':subproject.name').sourceSets.main.java.srcDirs).files }
失败原因
- 直接在dependencies块中获取子项目
sourceSets.main.java.srcDirs时,Gradle还处于配置阶段前期,根项目配置执行先于子项目,子项目尚未完成评估,此时拿到的srcDirs是空集合,所以最终类路径里不会有对应路径。等到任务执行的doFirst阶段,所有项目都已经评估完成,此时打印路径自然是正确的。 - 在
files()后调用.files会直接返回File对象集合,dependencies块不支持直接传入该类型作为依赖声明,因此抛出类型转换错误。
可行解决方案
方案1:闭包延迟解析(推荐)
将子项目路径的获取逻辑包裹在闭包中传入files(),Gradle会在依赖实际解析时才执行闭包取路径,此时所有项目已经完成配置,能拿到正确的srcDirs值:
dependencies { gwtCodeServer files(project.sourceSets.main.java.srcDirs) gwtCodeServer files(project.sourceSets.main.resources.srcDirs) gwtCodeServer files('C:/opt/gwt-2.9.0/gwt-codeserver.jar') // 闭包触发延迟求值 gwtCodeServer files({ project(':subproject.name').sourceSets.main.java.srcDirs }) }
方案2:afterEvaluate块延迟配置
将子项目的依赖添加逻辑放在afterEvaluate块中,等所有项目配置完成后再执行依赖声明:
dependencies { gwtCodeServer files(project.sourceSets.main.java.srcDirs) gwtCodeServer files(project.sourceSets.main.resources.srcDirs) gwtCodeServer files('C:/opt/gwt-2.9.0/gwt-codeserver.jar') } afterEvaluate { dependencies { gwtCodeServer files(project(':subproject.name').sourceSets.main.java.srcDirs) } }
内容的提问来源于stack exchange,提问作者tequilacat
相关产品推荐
相关产品推荐

