在Gradle中分割所有输出目录
Gradle 4.0昨天出来,我更新了我的项目。
现在我收到以下警告:
Gradle现在为每个JVM语言使用单独的输出目录,但是这个版本假设源集合中所有类的单个目录。 这个行为已经被弃用,并计划在Gradle 5.0中被删除
我想为每种语言使用单独的输出目录。 为了做到这一点,我需要改变什么?
我试过的东西:
- 随后由
gradle build
gradle clean
- 删除构建目录,然后运行
gradle build
。 - 删除gradle和build目录然后运行
gradle
相关的GitHub 问题
Gradle插件:
- java的
- 蚀
- 理念
- org.springframework.boot
Gradle 4.0为每个JVM语言引入了多个sourceSet以启用远程构建缓存。 用java
插件,你的build/classes/main
应该成为build/classes/java/main
, build/classes/test
应该成为build/classes/java/test
等。
该警告的定义如下:
@Override public File getClassesDir() { if (isLegacyLayout()) { return fileResolver.resolve(classesDir); } SingleMessageLogger.nagUserOfDeprecatedBehaviour("Gradle now uses separate output directories for each JVM language, but this build assumes a single directory for all classes from a source set"); Object firstClassesDir = CollectionUtils.findFirst(classesDirs.getFrom(), Specs.SATISFIES_ALL); if (firstClassesDir!=null) { return fileResolver.resolve(firstClassesDir); } return null; }
所以,如果你的项目中有任何插件或者你的build.gradle
调用DefaultSourceSetOutput.getClassesDir()
你会得到这个警告。
正式推荐的方法来摆脱这个警告是 :
sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
对应于:
@Override public boolean isLegacyLayout() { return classesDir!=null; } @Override public void setClassesDir(File classesDir) { setClassesDir((Object)classesDir); } @Override public void setClassesDir(Object classesDir) { this.classesDir = classesDir; this.classesDirs.setFrom(classesDir); }
请注意, https: getClassesDir()
将 getClassesDir()
标记为不建议使用 。
所以,直到所有在项目中使用的插件获得Gradle 4.0的支持,你应该坚持解决方法,并在Gradle源代码构建脚本中忽略弃用。
另一个问题是测试文件。 如果你不喜欢有不同的层次结构布局 ( build/classes/main
和build/classes/java/test
),你也应该调整测试路径:
sourceSets.main.output.classesDir = new File(buildDir, "classes/main") sourceSets.test.output.classesDir = new File(buildDir, "classes/test")
更新 IDEA的用户可能会注意到,IDE开始使用分离out
目录来构建它检测到的Gradle 4.x。 如果您在IDEA之外运行应用程序,则会导致无法重新加载应用程序。 要解决这个添加和重新导入:
subprojects { apply plugin: 'idea' // Due to Gradle 4.x changes (separate output directories per JVM language) // Idea developers refuse to reuse Gradle classpath and use own 'out/' directory. // Revert to old behavior to allow Spring Devtool to work with using fast Idea compiler. // https://youtrack.jetbrains.com/issue/IDEA-175172 // Alternatively use native Gradle builds or bootRun.addResources = true // To use this feature push Ctrl+Shift+F9 to recompile! // Be aware that Idea put resources into classes/ directory!! idea.module.inheritOutputDirs = false idea.module.outputDir = sourceSets.main.output.classesDir idea.module.testOutputDir = sourceSets.test.output.classesDir }
请注意,IDEA把资源放到与.class
文件相同的目录下,所以你的Gradle类路径将被损坏。 只需对您使用IDEA内置构建命令(Ctrl + Shift + F10等)的模块进行gradle clean
。
这是由于在Gradle 4.0中引入了更改:如果有多个语言源,它现在使用单独的输出目录。
要返回到旧的行为并摆脱警告,插入到您的build.gradle:
// Change the output directory for the main source set back to the old path sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
参考: https : //docs.gradle.org/4.0/release-notes.html#multiple-class-directories-for-a-single-source-set
例如,如果你混合使用Java,Kotlin和Groovy项目结构应该如下所示:
root/ src/ main/ java/ kotlin/ groovy/ test/ java/ kotlin/ groovy/
在你build.gradle你必须指定特定语言所需的插件。
apply plugin: 'java' apply plugin: 'groovy' apply plugin: 'kotlin'
- 将预先计算的结果从一个Kotlin活动发送到另一个文本视图
- 带有Kotlin错误的libGDX“org.jetbrains.kotlin.kapt.idea.KaptModelBuilderService”
- 在多项目设置中ConfigurationsContainer为空
- 库与Gradle 3.0.0-alphaX的依赖关系问题
- Android gradle插件抱怨Uncaught翻译错误
- AndroidStudio / Kotlin – 未解决的参考:ReadWriteProperty – Kotlin版本1.0.0-beta-1038
- 无法解析:com.google.firebase:firebase-auth:11.0.2
- 如何将kotlin-js-library更新为1.1.3,就像kotlin-gradle-plugin一样?
- JaCoCo Gradle插件报告每个包的0.0类覆盖率
- Kotlin脚本Gradle:build.gradle.kts和ShadowJar
- Gradle,’url’不能用于(java.lang.String)