如何定义自定义源集而不在Gradle中明确定义它的路径?

Dim*_*ims 7 java gradle

它是用手册写的:

在此输入图像描述

即,这src/sourceSet/java是"给定源集的Java源代码"的默认路径.

如何利用这个?假设我想创建源集demo.

我能写吗?

sourceSets {
    demo {
        java {
            srcDir 'src/demo/java'
        }
        resources {
            srcDir 'src/demo/resources'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

没有明确的路径,我能以某种方式写作吗

可能我不需要写任何东西,只是将文件放入demo子文件夹?

UPDATE

我测试过了

sourceSets {
    demo {
        java {
            srcDir 'src/demo/java'
        }
        resources {
            srcDir 'src/demo/resources'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和

sourceSets {
    demo {
        java
        resources
    }
}
Run Code Online (Sandbox Code Playgroud)

和

sourceSets {
    demo
}
Run Code Online (Sandbox Code Playgroud)

在所有情况下运行gradle build都不会导致编译源.

build.gradle 文件如下:

group 'net.inthemoon.tests'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

sourceSets {
    demo {
        java {
            srcDir 'src/demo/java'
        }
        resources {
            srcDir 'src/demo/resources'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例项目:https://github.com/dims12/MultipleSourceRoots

Arm*_*ius 4

Gradle 默认任务不会构建非默认源集,除非在主链中对它们有显式依赖。为了编译您的demo类,您必须gradle demoClasses按照 cricket_007 的答案进行调用 - 或者更好的是,只需gradle build demo这样做也会将生成的类放入目标 jar 中。

你所需要的就是这个:

sourceSets {
    demo
}
Run Code Online (Sandbox Code Playgroud)

...并且该build demo任务确实会按预期创建任何丢失的目录,除非您有一些有效的奇怪的权限方案。

现在我查看了您的 git 项目,看来您的演示源集取决于主要类。您需要明确此依赖关系(即将它们添加到demo类路径中)以避免编译错误:

sourceSets {
    main
    demo {
      compileClasspath += main.output
      runtimeClasspath += main.output
    }
}
Run Code Online (Sandbox Code Playgroud)