我正在尝试配置gradle(版本4.6)版本(作为多模块项目的一部分),它使用Java“脚本”在主sourceSet中生成资源,然后在我的测试配置中引用。我的想法是,我最终想要创建一个jar,它只是一个包含在我构建的另一个模块中的资源包,但是我有java文件来生成这些资源并在打包之前对它们执行验证测试。
我目前配置了三个sourceSets:标准的“main”和“test”,以及一个自定义的sourceSet“generator”,它保存用作生成器“script”的输入的资源和生成器脚本本身的源。我根据this文档注册了一个主输出目录(参见“使用生成的资源”),指向一个JavaExec类,该类使用“generator”sourceSet运行时类路径运行生成器,以将资源输出到主类路径中
所有这些似乎都有效 - 运行:<module>:build
时,我可以在正确的目录中找到输出,表明脚本运行正常,并且它是作为主编译任务的依赖项完成的。但是,当我尝试使用getClass().getClassLoader().getResource("<baseGeneratedOutputDirectory>")
在测试中引用生成的输出时,我得到一个空值,表明我生成的输出未包含在测试运行时类路径中。文件明确指出......
Java插件将在计算类路径时使用这些目录并用于震动内容
...所以我不确定为什么我的文件没有被拿起来。下面是我删节的build.gradle文件。请注意,我正在覆盖生成器任务类型,以便使用构建缓存进行设置,但我仍然看到关闭缓存的这个错误。
apply plugin: 'java-library'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
sourceSets {
generator {
java.srcDirs = ['src/generator/java']
resources.srcDirs = ['src/generator/resources']
}
main {
java
resources
output.dir("$buildDir/generated-files/main", builtBy: 'generateConfig')
}
test {
java
resources
}
}
dependencies {
api project(':server:server_protobuf_classes');
api project(':common:game-config-util')
api 'com.google.protobuf:protobuf-java:3.5.1'
generatorImplementation project(':common:game-config-util')
generatorImplementation project(':server:server_protobuf_classes');
generatorImplementation group: 'commons-io', name: 'commons-io', version: '2.5'
// ...
testCompile group: 'junit', name: 'junit', version: '4.11'
testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
testCompile group: 'commons-collections', name: 'commons-collections', version: '3.2.2'
// ...
}
task generateConfig(type: GenerateConfig) {
outputs.dir("$buildDir/generated-files/main")
classpath sourceSets.generator.runtimeClasspath
main = "com.project.ProtobufConfigurationProcessor"
}
@CacheableTask
class GenerateConfig extends JavaExec {
}
编辑:添加以下内容会使测试通过,但我很困惑为什么我需要手动配置这样的测试资源目录。测试任务不应该默认从主要源集中获取构建输出吗?
sourceSets {
test {
resources.srcDirs = ["$buildDir/generated-files/main"]
}
}