Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何定义自定义源集而不定义它';在Gradle中显式地显示s路径?_Java_Gradle - Fatal编程技术网

Java 如何定义自定义源集而不定义它';在Gradle中显式地显示s路径?

Java 如何定义自定义源集而不定义它';在Gradle中显式地显示s路径?,java,gradle,Java,Gradle,它是用手册写的: 也就是说,src/sourceSet/java是“给定源代码集的java源代码”的默认路径 如何利用这一点?假设我希望创建源代码集demo 我可以写信吗 sourceSets { demo { java { srcDir 'src/demo/java' } resources { srcDir 'src/demo/resources' } } }

它是用手册写的:

也就是说,
src/sourceSet/java
是“给定源代码集的java源代码”的默认路径

如何利用这一点?假设我希望创建源代码集
demo

我可以写信吗

sourceSets {
    demo {
        java {
            srcDir 'src/demo/java'
        }
        resources {
            srcDir 'src/demo/resources'
        }
    }
}
我是否可以在没有显式路径的情况下进行书写

我可能不需要写任何东西,只是把文件放进演示子文件夹

更新

我已经测试过了

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

在所有情况下,运行
gradlebuild
不会导致编译源代码

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'
        }
    }
}

示例项目:

这应该是您所需要的全部:

sourceSets {
    demo
}

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

全新的IntelliJ Java Gradle项目。(免责声明:我选中了自动创建空源目录的设置)

添加此项后,它创建了该演示目录及其下的资源

sourceSets {
    demo
}

要编译附加的
sourceSet
,可以运行

gradlew demoClasses

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

您所需要的就是:

sourceSets {
    demo
}
。。。而
builddemo
任务确实会像预期的那样创建任何丢失的目录,除非您有一些奇怪的有效权限方案

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

sourceSets {
    main
    demo {
      compileClasspath += main.output
      runtimeClasspath += main.output
    }
}
如其他答案中所述,要添加新的源集,只需编写:

sourceSets {
    demo {
        compileClasspath += main.output
    }
}
Java插件会自动将相应的
compileDemoJava
processDemoResources
任务添加到您的构建中

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

tasks.compileJava.dependsOn compileDemoJava
或者反过来说:

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

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

artifacts {
    archives demoJar
}
有关发布内容的更多信息,请参阅


更新

  • 添加了
    main.output
    ,以编译@Amine建议的演示源集的类路径

从命令行尝试使用
Gradle
IntelliJ
独立读取
build.gradle
,对其的解释可能与
gradle
本身不同。我知道它在这里更有效,这没关系。问题是关于
Gradle
@Dims您可能需要一个来创建这些目录,但是
java
插件应该默认创建
src/sourceSet/main
src/sourceSet/resources
文件夹,而没有其他指定的编译过程,应该创建这些目录。我说的是
build
子目录下的目录。你是什么意思?
build
任务将查看源集并将文件编译为
/build/classes/sourceSet
/build/resources/sourceSet
,理想情况下,您应该使用多模块设置来捆绑所有资源和类,而且不是一个单一的多源集模块。@Dims如果您执行
gradle build demo
,您能说什么不起作用吗?然后运行
gradle compileDemo
,或者查找添加到您的项目中的任务。您从哪里获得了
compileClasspath
runtimeClasspath
等名称?@Dims它在这里定义:。关于如何在网上使用这个,有很多例子。
tasks.compileJava.finalizedBy compileDemoJava
task demoJar(type: Jar) {
    from sourceSets.demo.output
}

artifacts {
    archives demoJar
}