java - 拆分 Gradle 中的所有输出目录

标签 java gradle build.gradle

Gradle 4.0 昨天发布了,我为此更新了我的项目。

现在我收到以下警告:

Gradle now uses separate output directories for each JVM language, but this build assumes a single directory for all classes from a source set. This behaviour has been deprecated and is scheduled to be removed in Gradle 5.0

我想为每种语言使用单独的输出目录。我需要进行哪些更改才能实现这一目标?


我尝试过的事情:

  • gradle clean 后跟 gradle build
  • 删除构建目录然后运行gradle build
  • 删除 gradle 和 build 目录然后运行 ​​gradle

相关 GitHub issue


Gradle 插件:

  • java
  • eclipse
  • 想法
  • org.springframework.boot

最佳答案

Gradle 4.0 为每种 JVM 语言引入了多个 sourceSet 以启用远程构建缓存。使用 java 插件,您的 build/classes/main 应该变成 build/classes/java/mainbuild/classes/test 应该变成 build/classes/java/test 等。

您看到的警告在 DefaultSourceSets.java 中定义

因此,如果您的项目或 build.gradle 中的任何插件调用 DefaultSourceSetOutput.getClassesDir()(或访问 classesDir),您会得到这个警告。

解决方案 1

使用

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);
}

请注意 SourceSetOutput.javagetClassesDir() 标记为已弃用。

因此,在您项目中的所有插件都支持 Gradle 4.0 之前,您应该坚持使用解决方法并忽略弃用警告。

另一个问题是测试文件。 如果你不想拥有新的布局(build/classes/mainbuild/classes/java/test)你应该调整测试路径:

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")

更新 如果检测到 Gradle 4.x,IDEA 的用户可能会注意到 IDE 开始使用单独的 out 目录进行构建。如果您在 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

关于java - 拆分 Gradle 中的所有输出目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44578302/

相关文章:

java - 读取 csv 文件时扫描仪出现 NoSuchElementException

java - 如何保护 Java EE 中的 WebSocket 端点?

junit - Sonar 单元测试报告参数-sonar.junit.reportPath与sonar.java.junit.reportPath

android - 模块库 Android Studio 上的 Twitter Kit Fabric Android

java - 获取 android gradle junit 测试运行的 XML/HTML 测试结果

android - 无法解决 Zxing 依赖项

java - Hibernate 设置的字段可以是最终的吗?

java - 将字符串解析为数组?

gradle - 如何使用 taskGraph.whenReady 关闭一个又一个任务

android - 如何从 Android 中的库类访问应用程序模块类?