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

时间:2016-04-05 09:06:18

标签: java gradle

用手册编写:

enter image description here

即。 src/sourceSet/java是“给定源集的Java源代码”的默认路径。

如何利用这个?假设我希望创建源集demo

我可以写

吗?
sourceSets {
    demo {
        java {
            srcDir 'src/demo/java'
        }
        resources {
            srcDir 'src/demo/resources'
        }
    }
}

我可以在没有明确路径的情况下以某种方式写作吗?

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

更新

我已经测试了

sourceSets {
    demo {
        java {
            srcDir 'src/demo/java'
        }
        resources {
            srcDir 'src/demo/resources'
        }
    }
}

sourceSets {
    demo {
        java
        resources
    }
}

sourceSets {
    demo
}

在所有情况下,运行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'
        }
    }
}

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

4 个答案:

答案 0 :(得分:2)

这应该是你所需要的:

sourceSets {
    demo
}

可能需要更多配置来定义这些源的依赖关系以及它们应该在何处使用。

答案 1 :(得分:2)

Gradle默认任务不会构建非默认源集,除非主链中存在明确的依赖关系。为了编译您的demo课程,您必须根据cricket_007的答案致电gradle demoClasses - 或者更好的是,只需执行gradle build demo,这也将生成目标jar中的类。

所有你需要的是:

sourceSets {
    demo
}

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

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

sourceSets {
    main
    demo {
      compileClasspath += main.output
      runtimeClasspath += main.output
    }
}

答案 2 :(得分:1)

全新的IntelliJ Java Gradle项目。 (免责声明:有一个设置可以自动创建我自动创建的空源目录)

content roots

添加后,它创建了该demo目录及其下的资源。

sourceSets {
    demo
}

intellij snapshot

要编译您可以运行的其他sourceSet

gradlew demoClasses

答案 3 :(得分:0)

gradle's documentation中所述并已在其他答案中提及,要添加新的源集,应该足以写:

sourceSets {
    demo {
        compileClasspath += main.output
    }
}

Java插件会自动将相应的compileDemoJavaprocessDemoResources任务添加到您的构建中。

要在常规构建期间自动执行这些任务,您可以向默认任务添加依赖项:

tasks.compileJava.dependsOn compileDemoJava

或者相反:

tasks.compileJava.finalizedBy compileDemoJava

要将新源集的输出添加到某个分发文件,您需要定义相应的任务并将此任务的输出声明为构建的工件:

task demoJar(type: Jar) {
    from sourceSets.demo.output
}

artifacts {
    archives demoJar
}

有关发布内容的进一步阅读,请参阅here

更新

  • 添加了main.output来编译@Amine
  • 已经建议的demo源集的类路径