如何让IntelliJ忽略gradle sourceSet的子集?

时间:2019-05-29 07:06:52

标签: gradle intellij-idea

我使用Java编写的编译器,将JDK 7至11生成的类文件编译为另一种格式。为了测试编译器,除其他外,我已使用JDK 7至11进行了编译,并使用了输出类文件作为测试的输入。

为此,我设置了多个源集:

compilerJava11 {
        java {
            srcDirs = ['src/main']
        }
    }
compilerJava10 {
        java {
            srcDirs = ['src/main']
        }
    }
...

然后我为每个sourceSet设置编译器:

tasks.named(sourceSets.compilerJava11.compileJavaTaskName).get().configure {
    def jdkDir = 'third_party/openjdk/jdk-11/'
    options.fork = true
    options.forkOptions.jvmArgs = []
    if (OperatingSystem.current().isLinux()) {
        options.forkOptions.javaHome = file(jdkDir + 'Linux')
    } else if (OperatingSystem.current().isMacOsX()) {
        options.forkOptions.javaHome = file(jdkDir + 'Mac')
    } else {
        options.forkOptions.javaHome = file(jdkDir + 'Windows')
    }
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}
...

并且Gradle通过不同的JDK为我正确地为编译器生成了类文件,我可以将其正确用作测试的输入。

现在我的问题是我在IntelliJ中工作,并且'src / main'srcDir在多个sourceSet中使用。 IntelliJ与主文件夹的内容混淆,告诉我存在多个副本(main.pathToFile,compilerJava10.pathToFile,compilerJava11.pathToFile等),并且部分工具混乱,无法正常工作。

为解决该问题,我去了Project Structure >>模块,并删除了所有的editorJava11,compilerJava10,...模块,只保留了主模块和不相关的模块。现在,我仍然拥有Gradle通过删除的sourceSet输出的类文件,并且IntelliJ可以正常运行。我需要在IntelliJ外部运行gradle来重新生成由不同JDK生成的类文件,但是没关系。所以,一切都很好。

现在,每次我与gradle同步时,我都需要再次手动删除模块。这很烦人。

我想在IntelliJ或gradle构建文件中指定一些内容,以便IntelliJ不导入gradle sourceSet编译器Java10,compilerJava11等,但仍将其他sourceSet(主要,其他测试sourceSet等)导入为模块。

我可以指定什么?IntelliJ不会在哪里将可用sourceSet的子集导入为模块?

我可以做一些事情,例如:

compilerJava11 {
        ideaImport = false
        java {
            srcDirs = ['src/main']
        }
    }

所以这个想法不会导入编译器Java11 sourceSet。

或者,如果您可以为我提供一种使用不同的Java编译器编译相同的sourceSet(在我的情况下为main)并保留不同的输出的方法,那么这对我也适用。

谢谢

解决方案:

最后,我停止了复制源集,而是创建了单独的JavaCompile任务来获取所需的已编译类文件。一个例子是:

task compileMainWithJava11 (type: JavaCompile) {
    def jdkDir = 'third_party/openjdk/jdk-11/'
    options.fork = true
    options.forkOptions.jvmArgs = []
    if (OperatingSystem.current().isLinux()) {
        options.forkOptions.javaHome = file(jdkDir + 'Linux')
    } else if (OperatingSystem.current().isMacOsX()) {
        options.forkOptions.javaHome = file(jdkDir + 'Mac')
    } else {
        options.forkOptions.javaHome = file(jdkDir + 'Windows')
    }
    source = sourceSets.main.allSource
    destinationDir = file(java11ClassFiles)
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
    classpath = sourceSets.main.compileClasspath
}

然后,我可以在file(java11ClassFiles)中访问生成的文件。 谢谢大家的帮助。

0 个答案:

没有答案