新的gradle格式混乱和迁移原因找不到方法testCompile

问题描述

我有一个build.gradle与

plugins {
   id {some plugin for all projects}
   id "com.diffplug.spotless" version "5.1.1"
}

然后我有一个allprojects {}部分,它定义了一个应用插件:'jacoco',还有一个子项目{}部分,它声明了应用插件:'java',还有其他几个

立即添加一尘不染的东西和错误,发现它找不到Java插件,因此我将所有插件修改为像这样在插件部分

plugins {
   id "java"
   id "checkstyle"
   id "eclipse"
   id "idea"
   id "jacoco"
   id "com.diffplug.spotless" version "5.1.1"
   id "com.dorongold.task-tree" version "1.5" //This prints out a task tree (pretty print)
}

然后导致此错误

Could not find method testCompile() for arguments [junit:junit:4.11] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

因此由于某种原因Java插件丢失了。我无法在这里找到合适的组合,以将所有内容迁移到这种新的插件部分格式。

我该怎么做?我随机尝试在所有项目和子项目中放置一个插件部分,但这会导致这个新错误

Could not find method plugins() for arguments [build_d8c2jgy4ua1m0vkv9kmvgefmc$_run_closure2$_closure5@62337fda] on root project 'providersvc-all' of type org.gradle.api.Project

此新插件部分如何工作?没有破坏一切,我似乎无法迁移。我只希望Java插件,testCompile和Spotless现在可以很好地一起玩

编辑(忘记附加无法使用的完整修整后的文件):

plugins {
   id "java"
   id "com.diffplug.spotless" version "5.1.1"
}

ext {
    //dependency versions every project usees so we version in one location all jars(less jar hell this way)
    deps = [
       'junit':           'junit:junit:4.11'
    ]
}

allprojects {
   repositories {
       jcenter()
       mavenCentral()
       maven {
           //webpieces VERSIONED snapshots so you can lock on a snapshot
          url "https://dl.bintray.com/deanhiller/maven"
       }

       //For testing locally
       maven {
         url uri('/tmp/myRepo/')
       }
   }
}

subprojects {
   dependencies {
       testCompile deps['junit']
   }
}

谢谢, 院长

解决方法

您仅将插件应用于根项目,而不是子项目。但是,如果您想通过subprojects配置来配置插件,则必须使用apply plugin语法。但是,如果您将两者结合在一起使用,则不必使用旧的buildscript块来配置类路径和存储库。

这里是一个例子。我假设根项目不是Java项目。我还删除了您的评论,而是插入了我的评论,这是出于使它们更易于发现的唯一原因。

plugins {
   id "com.diffplug.spotless" version "5.1.1" apply false // <-- Set "apply false" here
   // This makes it configure which version to use on the classpath for the entire build,but without applying it.
   // Notice that the Java plugin is not specified here anymore.
   // This is because it is a core plugin so you can't set the version (and I am assuming you don't want it on in the root project).
}

ext {
    deps = [
       'junit':           'junit:junit:4.11'
    ]
}

allprojects {
   repositories {
       jcenter()
       mavenCentral() // <-- You can remove this if you want as it is already present as a proxy in jcenter().
       maven {
          url "https://dl.bintray.com/deanhiller/maven"
       }

       maven {
         url uri('/tmp/myRepo/')
       }
   }
}

subprojects {
   // Here are the two plugins
   apply plugin: "java"
   apply plugin: "com.diffplug.spotless"

   dependencies {
       testImplementation deps['junit'] // <-- testCompile renamed to testImplementation as the former has been deprecated for a long time
   }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...