【问题标题】:Create a cheap new task class in Gradle在 Gradle 中创建一个廉价的新任务类
【发布时间】:2017-12-31 03:34:57
【问题描述】:

根据 Groovy 文档 Example 40.2,应该为任务创建一个新类(只需将其复制到 build.gradle):

task hello(type: GreetingTask)

class GreetingTask extends DefaultTask {
    @TaskAction
    def greet() {
        println 'hello from GreetingTask'
    }
}

但如果你真的尝试这样做,类声明会被标记为错误,因为没有编写抽象方法。其中大约有十个应该在这里......真的不可能像文档中那样以便宜的方式完成任务类吗?文档有什么问题?或者更确切地说,我的 IntelliJ 上有一些设置?

【问题讨论】:

  • 好吧,如果您只需要该类型的一项任务,则不需要自己的类,而只需 task hello(type: GreetingTask) { doLast { println 'hello from ad-hoc task' } }。但是你的例子对我来说很好,完全复制/粘贴。
  • 当然,我正在尝试为一些实际任务创建一个类(我想使用同一个类启动不同的任务)。但由于这个问题,它不起作用。所以,我放了一小段不起作用的代码。根据规则......我相信它也适用于文档作者。我怀疑原因是我在 IntelliJ 中有一些不同的设置。但是要检查什么?
  • 它可以从命令行工作吗?你能显示错误吗?
  • 我没有安装 gradle,AFAIK,只有 IntelliJ 中的 Gradle 插件。至少,我不能从命令行运行它。我希望它在 IntelliJ 中工作。
  • 顺便说一句。在我看来,每个项目,无论是最小的 test-poc 都应该使用 Gradle Wrapper。然后您知道,任何不故意忽略它的人都在使用与您设计构建的完全相同的 Gradle 版本构建您的项目,并且该版本适用于您的构建,而想要构建它的人只需要安装兼容的 Java 版本即可。

标签: class intellij-idea gradle gradle-plugin gradle-task


【解决方案1】:

您使用了错误的DefaultTask 类。来自 Gradle 的不是抽象的。

【讨论】:

  • 是的,我已经看过它的代码了。它只扩展了 AbstractTask。
  • 它本身也没有任何抽象方法。也许 Ctrl+Click 看看 IJ 认为它应该把你带到哪里。
  • AbstractTask 实现了两个接口。看来,Groovy 可以允许非抽象类不覆盖接口方法。 A 我说过,它在两种情况下都有效——当 IntelliJ 显示错误时和不显示错误时。因此,问题在于 IntelliJ 显示不存在的错误,它试图将类解释为 Java,而不是 Groovy。我看看申请的顺序......
  • 应用插件 java/groovy 的顺序没有影响。我认为这将在 IntelliJ 设置中有所体现...谢谢您的帮助和 +1
【解决方案2】:

当我在空的 Gradle/Groovy 项目中创建上述任务时,没有显示任何错误。

在我的项目上下文中,显示了错误。但是任务运行正常!这似乎又是 IntelliJ 的某种幻觉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多