我使用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)
中访问生成的文件。
谢谢大家的帮助。